
import { useCallback, useEffect } from 'react';
import { Transaction } from '@/contexts/budget/types';
import { getCurrentMonth, getPrevMonth, getNextMonth } from '../dateUtils';
import { filterTransactionsByMonth, filterTransactionsByQuery, calculateTotalExpenses } from '../filterUtils';
import { parseTransactionDate } from '@/utils/dateParser';

interface UseTransactionsFilteringProps {
  transactions: Transaction[];
  selectedMonth: string;
  setSelectedMonth: (month: string) => void;
  searchQuery: string;
  setFilteredTransactions: React.Dispatch<React.SetStateAction<Transaction[]>>;
}

/**
 * 트랜잭션 필터링 관련 커스텀 훅
 * 월간, 검색어 필터링 및 총 지출 계산 기능을 제공합니다.
 */
export const useTransactionsFiltering = ({
  transactions,
  selectedMonth,
  setSelectedMonth,
  searchQuery,
  setFilteredTransactions
}: UseTransactionsFilteringProps) => {
  // 필터링 적용
  useEffect(() => {
    console.log('트랜잭션 필터링 적용:', { 선택된월: selectedMonth, 검색어: searchQuery });
    
    try {
      // 먼저 월별 필터링 - 개선된 날짜 처리 기능 사용
      const monthFiltered = filterTransactionsByMonth(transactions, selectedMonth);
      console.log('월별 필터링 결과:', monthFiltered.length);
      
      // 그 다음 검색어 필터링
      const searchFiltered = searchQuery 
        ? filterTransactionsByQuery(monthFiltered, searchQuery)
        : monthFiltered;
      
      console.log('최종 필터링 결과:', searchFiltered.length);
      setFilteredTransactions(searchFiltered);
      
    } catch (error) {
      console.error('트랜잭션 필터링 중 오류 발생:', error);
      // 오류 발생 시 원본 데이터 유지
      setFilteredTransactions(transactions);
    }
  }, [transactions, selectedMonth, searchQuery, setFilteredTransactions]);

  // 이전 달로 이동
  const handlePrevMonth = useCallback(() => {
    setSelectedMonth(getPrevMonth(selectedMonth));
  }, [selectedMonth, setSelectedMonth]);

  // 다음 달로 이동
  const handleNextMonth = useCallback(() => {
    setSelectedMonth(getNextMonth(selectedMonth));
  }, [selectedMonth, setSelectedMonth]);

  // 총 지출 계산 - 개선된 계산 로직 사용
  const getTotalExpenses = useCallback((filteredTransactions: Transaction[]): number => {
    console.log('총 지출 계산 중...', filteredTransactions.length);
    const total = calculateTotalExpenses(filteredTransactions);
    console.log('계산된 총 지출:', total);
    return total;
  }, []);

  return {
    handlePrevMonth,
    handleNextMonth,
    getTotalExpenses
  };
};
