
import { useEffect } from 'react';
import { BudgetData, Transaction } from '../types';
import { calculateSpentAmounts, safelyLoadBudgetData } from '../budgetUtils';
import { saveBudgetDataToStorage } from '../storage';

/**
 * 예산 데이터 관련 이벤트를 처리하는 훅
 */
export const useBudgetDataEvents = (
  isInitialized: boolean,
  transactions: Transaction[],
  setBudgetData: (data: BudgetData) => void,
  setLastUpdateTime: (time: number) => void
) => {
  // budgetDataUpdated 이벤트 리스너 설정
  useEffect(() => {
    const handleBudgetUpdate = () => {
      console.log('예산 데이터 업데이트 이벤트 감지');
      
      // 현재 예산 데이터 로드하여 상태 업데이트
      const loadedData = safelyLoadBudgetData();
      setBudgetData(loadedData);
      setLastUpdateTime(Date.now());
    };
    
    window.addEventListener('budgetDataUpdated', handleBudgetUpdate);
    
    // 스토리지 이벤트도 함께 처리 (다른 탭/창에서의 업데이트 감지)
    const storageUpdateHandler = (e: StorageEvent) => {
      if (e.key === 'budgetData' || e.key === null) {
        console.log('스토리지 이벤트 감지 - 예산 데이터 업데이트');
        handleBudgetUpdate();
      }
    };
    window.addEventListener('storage', storageUpdateHandler);
    
    // 이벤트 리스너 정리
    return () => {
      window.removeEventListener('budgetDataUpdated', handleBudgetUpdate);
      window.removeEventListener('storage', storageUpdateHandler);
    };
  }, [isInitialized]);

  // 트랜잭션 변경 시 지출 금액 업데이트
  useEffect(() => {
    if (transactions.length > 0 && isInitialized) {
      console.log('트랜잭션 변경으로 인한 예산 데이터 업데이트. 트랜잭션 수:', transactions.length);
      try {
        // 현재 예산 데이터 다시 로드 (최신 상태 확보)
        const currentBudgetData = safelyLoadBudgetData();
        
        // 지출 금액 업데이트
        const updatedBudgetData = calculateSpentAmounts(transactions, currentBudgetData);
        
        // 변경이 있을 때만 저장
        if (JSON.stringify(updatedBudgetData) !== JSON.stringify(currentBudgetData)) {
          console.log('예산 지출액 업데이트 감지 - 데이터 저장');
          // 상태 및 스토리지 모두 업데이트
          setBudgetData(updatedBudgetData);
          saveBudgetDataToStorage(updatedBudgetData);
          setLastUpdateTime(Date.now());
          
          // 기타 컴포넌트에 이벤트 알림
          window.dispatchEvent(new Event('budgetDataUpdated'));
        }
      } catch (error) {
        console.error('예산 데이터 업데이트 중 오류:', error);
      }
    }
  }, [transactions, isInitialized]);
};
