
import { supabase } from '@/lib/supabase';
import { isSyncEnabled } from './syncSettings';
import { clearAllModifiedFlags } from './budget/modifiedBudgetsTracker';

/**
 * 서버에서 예산 데이터 다운로드
 */
export const downloadBudgets = async (userId: string): Promise<void> => {
  if (!isSyncEnabled()) return;

  try {
    console.log('서버에서 예산 데이터 다운로드 시작');
    
    // 현재 월/년도 가져오기
    const now = new Date();
    const currentMonth = now.getMonth() + 1; // 0-11 -> 1-12
    const currentYear = now.getFullYear();
    
    // 1. 월간 예산 다운로드
    const { data: budgetData, error: budgetError } = await supabase
      .from('budgets')
      .select('*')
      .eq('user_id', userId)
      .eq('month', currentMonth)
      .eq('year', currentYear)
      .order('updated_at', { ascending: false })
      .limit(1);
      
    if (budgetError) {
      console.error('월간 예산 다운로드 실패:', budgetError);
      throw budgetError;
    }
    
    if (budgetData && budgetData.length > 0) {
      const monthlyBudget = budgetData[0].total_budget;
      
      // 예산이 0이거나 음수면 처리하지 않음
      if (monthlyBudget <= 0) {
        console.log('서버에 저장된 예산이 0이하여서 다운로드 건너뜀:', monthlyBudget);
        return;
      }
      
      // 기존 예산 데이터 가져오기
      let budgetDataObj = {
        daily: { targetAmount: 0, spentAmount: 0, remainingAmount: 0 },
        weekly: { targetAmount: 0, spentAmount: 0, remainingAmount: 0 },
        monthly: { targetAmount: 0, spentAmount: 0, remainingAmount: 0 }
      };
      
      try {
        const storedBudgetData = localStorage.getItem('budgetData');
        if (storedBudgetData) {
          budgetDataObj = JSON.parse(storedBudgetData);
          // 필요한 속성이 없으면 추가
          if (!budgetDataObj.daily) {
            budgetDataObj.daily = { targetAmount: 0, spentAmount: 0, remainingAmount: 0 };
          }
          if (!budgetDataObj.weekly) {
            budgetDataObj.weekly = { targetAmount: 0, spentAmount: 0, remainingAmount: 0 };
          }
          if (!budgetDataObj.monthly) {
            budgetDataObj.monthly = { targetAmount: 0, spentAmount: 0, remainingAmount: 0 };
          }
        }
      } catch (e) {
        console.error('로컬 예산 데이터 파싱 오류:', e);
      }
      
      // 서버의 예산이 로컬 예산보다 클 때에만 로컬 예산 덮어쓰기
      if (monthlyBudget > budgetDataObj.monthly.targetAmount) {
        console.log('서버 예산이 로컬 예산보다 큼. 로컬 예산 업데이트:', 
          `서버: ${monthlyBudget}, 로컬: ${budgetDataObj.monthly.targetAmount}`);
        
        // 월간 예산만 업데이트
        budgetDataObj.monthly.targetAmount = monthlyBudget;
        
        // 일간, 주간 예산 계산 (이전 비율 유지)
        const daysInMonth = new Date(currentYear, currentMonth, 0).getDate();
        budgetDataObj.daily = {
          targetAmount: Math.round(monthlyBudget / daysInMonth),
          spentAmount: budgetDataObj.daily?.spentAmount || 0,
          remainingAmount: Math.round(monthlyBudget / daysInMonth) - (budgetDataObj.daily?.spentAmount || 0)
        };
        
        budgetDataObj.weekly = {
          targetAmount: Math.round(monthlyBudget * 7 / daysInMonth),
          spentAmount: budgetDataObj.weekly?.spentAmount || 0,
          remainingAmount: Math.round(monthlyBudget * 7 / daysInMonth) - (budgetDataObj.weekly?.spentAmount || 0)
        };
        
        // 업데이트된 예산 데이터 저장
        localStorage.setItem('budgetData', JSON.stringify(budgetDataObj));
        console.log('월간 예산 다운로드 및 저장 완료:', monthlyBudget);
      } else {
        console.log('로컬 예산이 서버 예산보다 크거나 같음. 예산 유지:', 
          `로컬: ${budgetDataObj.monthly.targetAmount}, 서버: ${monthlyBudget}`);
      }
    } else {
      console.log('서버에 저장된 월간 예산 데이터가 없습니다.');
    }
    
    // 2. 카테고리 예산 다운로드
    const { data: categoryData, error: categoryError } = await supabase
      .from('category_budgets')
      .select('*')
      .eq('user_id', userId);
      
    if (categoryError) {
      console.error('카테고리 예산 다운로드 실패:', categoryError);
      throw categoryError;
    }
    
    if (categoryData && categoryData.length > 0) {
      // 현재 로컬 카테고리 예산 확인
      let currentCategoryBudgets: Record<string, number> = {};
      try {
        const storedCategoryBudgets = localStorage.getItem('categoryBudgets');
        if (storedCategoryBudgets) {
          currentCategoryBudgets = JSON.parse(storedCategoryBudgets);
        }
      } catch (e) {
        console.error('로컬 카테고리 예산 파싱 오류:', e);
      }
      
      // 카테고리 예산 객체 구성
      const serverCategoryBudgets: Record<string, number> = {};
      
      categoryData.forEach(item => {
        serverCategoryBudgets[item.category] = item.amount;
      });
      
      // 서버 카테고리 예산 총액 계산
      const serverTotal = Object.values(serverCategoryBudgets).reduce((sum, val) => sum + val, 0);
      const localTotal = Object.values(currentCategoryBudgets).reduce((sum, val) => sum + val, 0);
      
      // 서버 카테고리 예산이 로컬보다 클 때만 업데이트
      if (serverTotal > localTotal) {
        console.log('서버 카테고리 예산이 로컬보다 큼. 로컬 업데이트:', 
          `서버: ${serverTotal}, 로컬: ${localTotal}`);
          
        // 카테고리 예산 저장
        localStorage.setItem('categoryBudgets', JSON.stringify(serverCategoryBudgets));
        console.log('카테고리 예산 다운로드 및 저장 완료:', serverCategoryBudgets);
      } else {
        console.log('로컬 카테고리 예산이 서버보다 크거나 같음. 유지:', 
          `로컬: ${localTotal}, 서버: ${serverTotal}`);
      }
    } else {
      console.log('서버에 저장된 카테고리 예산 데이터가 없습니다.');
    }
    
    // 수정 플래그 초기화
    clearAllModifiedFlags();
    
    // UI 업데이트를 위한 이벤트 발생
    window.dispatchEvent(new Event('budgetDataUpdated'));
    window.dispatchEvent(new Event('categoryBudgetsUpdated'));
    
    console.log('예산 데이터 다운로드 완료');
  } catch (error) {
    console.error('예산 데이터 다운로드 오류:', error);
    throw error;
  }
};
