
import { BudgetData, Transaction } from '../types';
import { format, isWithinInterval, subDays, startOfMonth, endOfMonth, parseISO } from 'date-fns';

// 지출액 계산 (일일, 주간, 월간)
export const calculateSpentAmounts = (
  transactions: Transaction[],
  prevBudgetData: BudgetData
): BudgetData => {
  console.log("지출액 계산 시작, 트랜잭션 수:", transactions.length);
  
  // 지출 거래 필터링
  const expenseTransactions = transactions.filter(t => t.type === 'expense');
  console.log("필터링된 지출 트랜잭션:", expenseTransactions.length);
  
  // 현재 날짜 정보
  const now = new Date();
  const today = format(now, 'yyyy-MM-dd');
  const currentMonth = format(now, 'yyyy-MM');
  const startOfCurrentMonth = startOfMonth(now);
  const endOfCurrentMonth = endOfMonth(now);
  
  // 각 지출 트랜잭션의 날짜 정보 로깅
  expenseTransactions.forEach((t, index) => {
    if (index < 10) { // 처음 10개만 로그 출력 (너무 많은 로그 방지)
      console.log(`트랜잭션 ${index}: 날짜=${t.date}, 금액=${t.amount}, 카테고리=${t.category}`);
    }
  });

  // 날짜 문자열을 Date 객체로 변환하는 함수
  const parseTransactionDate = (dateStr: string): Date | null => {
    try {
      if (dateStr.includes('오늘')) {
        return new Date();
      }
      
      if (dateStr.includes('어제')) {
        return subDays(new Date(), 1);
      }
      
      // "yyyy-MM-dd" 형식 확인
      if (/^\d{4}-\d{2}-\d{2}/.test(dateStr)) {
        return parseISO(dateStr);
      }
      
      // "MM월 dd일" 형식 확인 (한국어 날짜)
      const koreanDateMatch = dateStr.match(/(\d+)월\s*(\d+)일/);
      if (koreanDateMatch) {
        const month = parseInt(koreanDateMatch[1]) - 1; // 0-based month
        const day = parseInt(koreanDateMatch[2]);
        const year = now.getFullYear();
        return new Date(year, month, day);
      }
      
      // 기타 날짜 문자열은 그대로 Date 생성자에 전달
      return new Date(dateStr);
    } catch (e) {
      console.error('날짜 파싱 실패:', dateStr, e);
      return null;
    }
  };

  // 월간 지출 계산 (현재 달의 모든 지출)
  const monthlyExpenses = expenseTransactions.filter(t => {
    try {
      const transactionDate = parseTransactionDate(t.date);
      if (!transactionDate) return false;
      
      return isWithinInterval(transactionDate, {
        start: startOfCurrentMonth,
        end: endOfCurrentMonth
      });
    } catch (e) {
      console.error('월간 지출 필터링 오류:', e);
      // 날짜 형식이 명확하지 않은 경우, 트랜잭션 날짜 문자열에 현재 월 문자열이 포함되어 있는지 확인
      return t.date.includes(currentMonth) || 
             t.date.includes(format(now, 'M월')) || 
             t.date.includes('이번 달');
    }
  });
  
  // 주간 지출 계산 (최근 7일)
  const weeklyExpenses = expenseTransactions.filter(t => {
    try {
      const transactionDate = parseTransactionDate(t.date);
      if (!transactionDate) return false;
      
      return isWithinInterval(transactionDate, {
        start: subDays(now, 7),
        end: now
      });
    } catch (e) {
      // 날짜 형식이 명확하지 않은 경우, 최근에 추가된 항목으로 간주
      return t.date.includes('오늘') || 
             t.date.includes('어제') || 
             t.date.includes('이번 주') ||
             t.date.includes('일 전');
    }
  });
  
  // 일일 지출 계산 (오늘)
  const dailyExpenses = expenseTransactions.filter(t => {
    try {
      const transactionDate = parseTransactionDate(t.date);
      if (!transactionDate) return false;
      
      return format(transactionDate, 'yyyy-MM-dd') === today;
    } catch (e) {
      // 날짜 형식이 명확하지 않은 경우, 오늘 추가된 항목인지 확인
      return t.date.includes('오늘') || t.date.includes('지금');
    }
  });
  
  // 계산된 지출 금액
  const dailyTotal = dailyExpenses.reduce((sum, t) => sum + t.amount, 0);
  const weeklyTotal = weeklyExpenses.reduce((sum, t) => sum + t.amount, 0);
  const monthlyTotal = monthlyExpenses.reduce((sum, t) => sum + t.amount, 0);
  
  console.log("계산된 지출 금액:", {
    일일: dailyTotal,
    주간: weeklyTotal,
    월간: monthlyTotal
  });

  // 예산 데이터에 적용 전 로그
  console.log("기존 예산 데이터:", prevBudgetData);
  
  // 기존 예산 목표 유지
  const dailyTarget = prevBudgetData?.daily?.targetAmount || 0;
  const weeklyTarget = prevBudgetData?.weekly?.targetAmount || 0;
  const monthlyTarget = prevBudgetData?.monthly?.targetAmount || 0;

  // 예산 데이터 업데이트
  const updatedBudget = {
    daily: {
      targetAmount: dailyTarget,
      spentAmount: dailyTotal,
      remainingAmount: Math.max(0, dailyTarget - dailyTotal)
    },
    weekly: {
      targetAmount: weeklyTarget,
      spentAmount: weeklyTotal,
      remainingAmount: Math.max(0, weeklyTarget - weeklyTotal)
    },
    monthly: {
      targetAmount: monthlyTarget,
      spentAmount: monthlyTotal,
      remainingAmount: Math.max(0, monthlyTarget - monthlyTotal)
    }
  };
  
  console.log("업데이트된 예산 데이터:", updatedBudget);
  
  return updatedBudget;
};
