
import { useEffect } from 'react';
import { Transaction, BudgetData, BudgetPeriod, BudgetContextType } from './types';
import { useBudgetDataState } from './hooks/useBudgetDataState';
import { useTransactionState } from './hooks/useTransactionState';
import { useCategoryBudgetState } from './hooks/useCategoryBudgetState';
import { useCategorySpending } from './hooks/useCategorySpending';
import { useExtendedBudgetUpdate } from './hooks/useExtendedBudgetUpdate';

/**
 * 애플리케이션 예산 데이터 상태 관리를 위한 통합 훅
 * 트랜잭션, 예산 데이터, 카테고리 예산 등을 관리합니다.
 */
export const useBudgetState = () => {
  // 트랜잭션 상태 관리
  const {
    transactions,
    addTransaction,
    updateTransaction,
    deleteTransaction
  } = useTransactionState();

  // 카테고리 예산 상태 관리
  const { categoryBudgets, setCategoryBudgets } = useCategoryBudgetState();

  // 예산 데이터 상태 관리
  const {
    budgetData,
    selectedTab,
    setSelectedTab,
    handleBudgetGoalUpdate,
    resetBudgetData
  } = useBudgetDataState(transactions);
  
  // 확장된 예산 업데이트 로직 - 기존 로직과 호환성 유지
  const extendedBudgetUpdate = useExtendedBudgetUpdate(
    handleBudgetGoalUpdate,
    setCategoryBudgets
  );

  // 카테고리별 지출 계산
  const { getCategorySpending } = useCategorySpending(transactions, categoryBudgets);

  // 결제 방법 통계 계산 함수
  const getPaymentMethodStats = () => {
    // 지출 트랜잭션 필터링
    const expenseTransactions = transactions.filter(t => t.type === 'expense');
    
    // 총 지출 계산
    const totalExpense = expenseTransactions.reduce((acc, curr) => acc + curr.amount, 0);
    
    // 결제 방법별 금액 계산
    const cardExpense = expenseTransactions
      .filter(t => t.paymentMethod === '신용카드' || !t.paymentMethod) // paymentMethod가 없으면 신용카드로 간주
      .reduce((acc, curr) => acc + curr.amount, 0);
      
    const cashExpense = expenseTransactions
      .filter(t => t.paymentMethod === '현금')
      .reduce((acc, curr) => acc + curr.amount, 0);
    
    // 결과 배열 생성 - 금액이 큰 순서대로 정렬
    const result = [
      { 
        method: '신용카드', 
        amount: cardExpense,
        percentage: totalExpense > 0 ? (cardExpense / totalExpense) * 100 : 0
      },
      { 
        method: '현금', 
        amount: cashExpense,
        percentage: totalExpense > 0 ? (cashExpense / totalExpense) * 100 : 0
      }
    ].sort((a, b) => b.amount - a.amount);
    
    return result;
  };

  // 디버깅 로그 추가
  useEffect(() => {
    console.log('예산 상태 업데이트:', 
      '트랜잭션 수:', transactions.length, 
      '카테고리 예산:', categoryBudgets, 
      '예산 데이터:', budgetData
    );
  }, [transactions, categoryBudgets, budgetData]);

  return {
    transactions,
    categoryBudgets,
    budgetData,
    selectedTab,
    setSelectedTab,
    addTransaction,
    updateTransaction,
    deleteTransaction,
    handleBudgetGoalUpdate: extendedBudgetUpdate, // 확장된 버전 사용
    getCategorySpending,
    getPaymentMethodStats,
    resetBudgetData,
  };
};
