'use client';

import { useCallback, useState, type MouseEvent } from 'react';
import type { ForecastModalState, ForecastPreviewModalState } from '@/lib/forecast-modal';

export default function useForecastTransitionState() {
  const [forecast, setForecast] = useState<ForecastModalState | null>(null);
  const [previewData, setPreviewData] = useState<ForecastPreviewModalState | null>(null);
  const [flyingMathActive, setFlyingMathActive] = useState(false);
  const [flyingMathOrigin, setFlyingMathOrigin] = useState({ x: 0, y: 0 });
  const [pendingForecast, setPendingForecast] = useState<ForecastModalState | null>(null);
  const [pendingPreviewData, setPendingPreviewData] = useState<ForecastPreviewModalState | null>(null);

  const triggerFlyingMath = useCallback((event?: MouseEvent) => {
    const x = event ? event.clientX : window.innerWidth / 2;
    const y = event ? event.clientY : window.innerHeight / 2;
    setFlyingMathOrigin({ x, y });
    setFlyingMathActive(true);
  }, []);

  const clearPendingTransitions = useCallback(() => {
    setPendingForecast(null);
    setPendingPreviewData(null);
  }, []);

  const queueForecast = useCallback((nextForecast: ForecastModalState, event?: MouseEvent) => {
    setPreviewData(null);
    setPendingPreviewData(null);
    setPendingForecast(nextForecast);
    triggerFlyingMath(event);
  }, [triggerFlyingMath]);

  const queuePreview = useCallback((nextPreview: ForecastPreviewModalState, event?: MouseEvent) => {
    setForecast(null);
    setPendingForecast(null);
    setPreviewData(null);
    setPendingPreviewData(nextPreview);
    triggerFlyingMath(event);
  }, [triggerFlyingMath]);

  const showForecastImmediately = useCallback((nextForecast: ForecastModalState) => {
    setPreviewData(null);
    setPendingPreviewData(null);
    setPendingForecast(null);
    setForecast(nextForecast);
  }, []);

  const handleFlyingMathComplete = useCallback(() => {
    setFlyingMathActive(false);
    if (pendingForecast) {
      setForecast(pendingForecast);
      setPendingForecast(null);
    }
    if (pendingPreviewData) {
      setPreviewData(pendingPreviewData);
      setPendingPreviewData(null);
    }
  }, [pendingForecast, pendingPreviewData]);

  const closeForecast = useCallback(() => {
    setForecast(null);
  }, []);

  const closePreview = useCallback(() => {
    setPreviewData(null);
  }, []);

  return {
    forecast,
    previewData,
    flyingMathActive,
    flyingMathOrigin,
    pendingForecast,
    pendingPreviewData,
    setForecast,
    setPendingForecast,
    setPreviewData,
    clearPendingTransitions,
    queueForecast,
    queuePreview,
    showForecastImmediately,
    handleFlyingMathComplete,
    closeForecast,
    closePreview,
  };
}
