
import { useState, useEffect, useCallback } from 'react';
import { BudgetData, BudgetPeriod, Transaction } from './types';
import { useBudgetDataState } from './hooks/useBudgetDataState';
import { useCategoryBudgetState } from './hooks/useCategoryBudgetState';
import { useTransactionState } from './hooks/useTransactionState';
import { calculateCategorySpending } from './budgetUtils';
import { toast } from '@/hooks/useToast.wrapper';
import { loadCategoryBudgetsFromStorage, saveCategoryBudgetsToStorage } from './storage';

/**
 * 예산 상태 관리를 위한 메인 훅
 */
export const useBudgetState = () => {
  // 트랜잭션 상태 관리
  const {
    transactions,
    addTransaction,
    updateTransaction,
    deleteTransaction
  } = useTransactionState();
  
  // 예산 데이터 상태 관리
  const {
    budgetData,
    selectedTab,
    setSelectedTab,
    handleBudgetGoalUpdate,
    resetBudgetData
  } = useBudgetDataState(transactions);

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

  // 카테고리별 지출 계산
  const getCategorySpending = useCallback(() => {
    return calculateCategorySpending(transactions, categoryBudgets);
  }, [transactions, categoryBudgets]);

  // 예산 목표 업데이트 함수 (기존 함수 래핑)
  const handleBudgetUpdate = useCallback((
    type: BudgetPeriod, 
    amount: number, 
    newCategoryBudgets?: Record<string, number>
  ) => {
    console.log(`예산 업데이트 시작: ${type}, 금액: ${amount}, 카테고리 예산:`, newCategoryBudgets);
    
    try {
      // 금액이 유효한지 확인
      if (isNaN(amount) || amount <= 0) {
        console.error('유효하지 않은 예산 금액:', amount);
        toast({
          title: "예산 설정 오류",
          description: "유효한 예산 금액을 입력해주세요.",
          variant: "destructive"
        });
        return;
      }
      
      // 카테고리 예산이 제공된 경우
      if (newCategoryBudgets) {
        console.log('카테고리 예산도 함께 업데이트:', newCategoryBudgets);
        
        // 카테고리 예산의 합계 검증 - 가져온 totalBudget과 카테고리 총합이 같아야 함
        const categoryTotal = Object.values(newCategoryBudgets).reduce((sum, val) => sum + val, 0);
        console.log(`카테고리 예산 합계: ${categoryTotal}, 입력 금액: ${amount}`);
        
        // 금액이 카테고리 합계와 다르면 로그 기록 (허용 오차 ±10)
        if (Math.abs(categoryTotal - amount) > 10) {
          console.warn('카테고리 예산 합계와 총 예산이 일치하지 않음 - 카테고리 합계를 사용함');
          // 카테고리 합계를 기준으로 예산 설정
          amount = categoryTotal;
        }
        
        // 카테고리 예산 저장
        updateCategoryBudgets(newCategoryBudgets);
        saveCategoryBudgetsToStorage(newCategoryBudgets);
        console.log('카테고리 예산 저장 완료');
      }
      
      // 항상 월간 타입으로 예산 업데이트 (BudgetTabContent에서는 항상 월간 예산을 전달)
      handleBudgetGoalUpdate('monthly', amount);
      console.log('예산 데이터 업데이트 완료');
      
    } catch (error) {
      console.error('예산 업데이트 오류:', error);
      toast({
        title: "예산 업데이트 실패",
        description: "예산 설정 중 오류가 발생했습니다.",
        variant: "destructive"
      });
    }
  }, [handleBudgetGoalUpdate, updateCategoryBudgets]);

  // 모든 데이터 초기화
  const resetAllData = useCallback(() => {
    resetBudgetData?.();
    resetCategoryBudgets();
  }, [resetBudgetData, resetCategoryBudgets]);

  // 상태 디버깅 (개발 시 유용)
  useEffect(() => {
    console.log('BudgetState 훅 - 현재 상태:');
    console.log('- 예산 데이터:', budgetData);
    console.log('- 카테고리 예산:', categoryBudgets);
    console.log('- 트랜잭션 수:', transactions.length);
  }, [budgetData, categoryBudgets, transactions.length]);

  return {
    // 데이터
    transactions,
    budgetData,
    categoryBudgets,
    selectedTab,
    
    // 상태 변경 함수
    setSelectedTab,
    addTransaction,
    updateTransaction,
    deleteTransaction,
    handleBudgetGoalUpdate: handleBudgetUpdate,  // 래핑된 함수 사용
    
    // 도우미 함수
    getCategorySpending,
    
    // 데이터 초기화
    resetBudgetData: resetAllData
  };
};
