
import { useEffect } from 'react';
import { Transaction, BudgetData } from '../types';
import { calculateSpentAmounts } from '../utils/spendingCalculation';

export const useBudgetDataEvents = (
  isInitialized: boolean,
  transactions: Transaction[],
  setBudgetData: React.Dispatch<React.SetStateAction<BudgetData>>,
  setLastUpdateTime: React.Dispatch<React.SetStateAction<number>>
) => {
  // 트랜잭션 데이터가 변경될 때마다 예산 데이터 업데이트
  useEffect(() => {
    if (!isInitialized || transactions.length === 0) return;
    
    console.log('트랜잭션 변경 감지, 예산 데이터 업데이트 중...', transactions.length);
    
    setBudgetData(prevBudgetData => {
      // 현재 지출 금액 계산
      const updatedBudgetData = calculateSpentAmounts(transactions, prevBudgetData);
      
      // 마지막 업데이트 시간 기록
      setLastUpdateTime(Date.now());
      
      console.log('예산 데이터 업데이트 완료:', updatedBudgetData);
      return updatedBudgetData;
    });
  }, [isInitialized, transactions, setBudgetData, setLastUpdateTime]);

  // 트랜잭션 변경 감지 이벤트
  useEffect(() => {
    if (!isInitialized) return;
    
    const handleTransactionChanged = (event: CustomEvent) => {
      console.log('트랜잭션 변경 이벤트 감지', event.detail);
      
      setBudgetData(prevBudgetData => {
        // 현재 지출 금액 계산
        const updatedBudgetData = calculateSpentAmounts(transactions, prevBudgetData);
        
        // 마지막 업데이트 시간 기록
        setLastUpdateTime(Date.now());
        
        return updatedBudgetData;
      });
    };
    
    // 이벤트 리스너 등록
    window.addEventListener('transactionChanged', handleTransactionChanged as EventListener);
    
    return () => {
      // 이벤트 리스너 제거
      window.removeEventListener('transactionChanged', handleTransactionChanged as EventListener);
    };
  }, [isInitialized, transactions, setBudgetData, setLastUpdateTime]);
  
  // 스토리지 이벤트 리스너 (다른 탭에서도 데이터 동기화)
  useEffect(() => {
    if (!isInitialized) return;
    
    const handleStorageChange = (event: StorageEvent) => {
      if (event.key === 'transactions') {
        console.log('스토리지 이벤트 감지: 트랜잭션 데이터 변경');
        
        try {
          // 새 트랜잭션 데이터로 예산 계산
          if (event.newValue) {
            const newTransactions = JSON.parse(event.newValue);
            
            setBudgetData(prevBudgetData => {
              // 현재 지출 금액 계산
              const updatedBudgetData = calculateSpentAmounts(newTransactions, prevBudgetData);
              
              // 마지막 업데이트 시간 기록
              setLastUpdateTime(Date.now());
              
              return updatedBudgetData;
            });
          }
        } catch (error) {
          console.error('스토리지 이벤트 처리 중 오류:', error);
        }
      }
    };
    
    // 이벤트 리스너 등록
    window.addEventListener('storage', handleStorageChange);
    
    return () => {
      // 이벤트 리스너 제거
      window.removeEventListener('storage', handleStorageChange);
    };
  }, [isInitialized, setBudgetData, setLastUpdateTime]);
  
  // 예산 데이터 수동 새로고침 이벤트 
  useEffect(() => {
    if (!isInitialized) return;
    
    const handleBudgetRefresh = () => {
      console.log('예산 데이터 수동 새로고침 이벤트 감지');
      
      setBudgetData(prevBudgetData => {
        // 현재 지출 금액 계산
        const updatedBudgetData = calculateSpentAmounts(transactions, prevBudgetData);
        
        // 마지막 업데이트 시간 기록
        setLastUpdateTime(Date.now());
        
        return updatedBudgetData;
      });
    };
    
    // 수동 새로고침 이벤트 등록
    window.addEventListener('budgetDataRefresh', handleBudgetRefresh);
    
    return () => {
      // 이벤트 리스너 제거
      window.removeEventListener('budgetDataRefresh', handleBudgetRefresh);
    };
  }, [isInitialized, transactions, setBudgetData, setLastUpdateTime]);
};
