
import { useCallback } from 'react';
import { BudgetData, BudgetPeriod } from '../types';
import { calculateUpdatedBudgetData, safelyLoadBudgetData } from '../budgetUtils';
import { saveBudgetDataToStorage } from '../storage';
import { toast } from '@/hooks/useToast.wrapper';

/**
 * 예산 목표 업데이트 기능을 제공하는 훅
 */
export const useBudgetGoalUpdate = (
  setBudgetData: (data: BudgetData) => void,
  setLastUpdateTime: (time: number) => void
) => {
  // 예산 목표 업데이트 함수
  const handleBudgetGoalUpdate = useCallback((
    type: BudgetPeriod, 
    amount: number
  ) => {
    try {
      console.log(`예산 목표 업데이트 시작: ${type}, 금액: ${amount}`);
      
      // 금액이 유효한지 확인
      if (isNaN(amount) || amount <= 0) {
        console.error('유효하지 않은 예산 금액:', amount);
        toast({
          title: "예산 설정 오류",
          description: "유효한 예산 금액을 입력해주세요.",
          variant: "destructive"
        });
        return;
      }
      
      // 현재 최신 예산 데이터 로드 (다른 곳에서 변경되었을 수 있음)
      const currentBudgetData = safelyLoadBudgetData();
      
      // 예산 데이터 업데이트 - 월간 기준으로 계산
      const updatedBudgetData = calculateUpdatedBudgetData(currentBudgetData, type, amount);
      console.log('새 예산 데이터 계산됨:', updatedBudgetData);
      
      // 상태 및 스토리지 둘 다 업데이트
      setBudgetData(updatedBudgetData);
      saveBudgetDataToStorage(updatedBudgetData);
      setLastUpdateTime(Date.now());
      
      // 이벤트 발생시켜 다른 컴포넌트에 알림
      window.dispatchEvent(new Event('budgetDataUpdated'));
      
      // 시간차를 두고 이벤트 추가 발생 (UI 갱신 확실히 하기 위함)
      setTimeout(() => {
        window.dispatchEvent(new Event('budgetDataUpdated'));
        window.dispatchEvent(new StorageEvent('storage', {
          key: 'budgetData',
          newValue: JSON.stringify(updatedBudgetData)
        }));
      }, 500);
      
      console.log('예산 목표 업데이트 완료:', updatedBudgetData);
      
      // 성공 메시지 표시
      const periodText = type === 'daily' ? '일일' : type === 'weekly' ? '주간' : '월간';
      toast({
        title: "예산 설정 완료",
        description: `${periodText} 예산이 ${amount.toLocaleString()}원으로 설정되었습니다.`,
      });
    } catch (error) {
      console.error('예산 목표 업데이트 중 오류:', error);
      toast({
        title: "예산 업데이트 실패",
        description: "예산 목표를 업데이트하는데 문제가 발생했습니다.",
        variant: "destructive"
      });
    }
  }, []);

  return handleBudgetGoalUpdate;
};
