import { supabase } from '@/lib/supabase';
import { isSyncEnabled } from '../syncSettings';
import { 
  clearModifiedBudget, 
  clearModifiedCategoryBudgets 
} from './modifiedBudgetsTracker';

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

  try {
    const budgetDataStr = localStorage.getItem('budgetData');
    const categoryBudgetsStr = localStorage.getItem('categoryBudgets');
    
    console.log('예산 데이터 업로드 시작');
    
    // 예산 데이터 업로드
    if (budgetDataStr) {
      const budgetData = JSON.parse(budgetDataStr);
      await uploadBudgetData(userId, budgetData);
      
      // 업로드 성공 후 수정 추적 정보 초기화
      clearModifiedBudget();
    } else {
      console.log('업로드할 예산 데이터가 없음');
    }
    
    // 카테고리 예산 업로드
    if (categoryBudgetsStr) {
      const categoryBudgets = JSON.parse(categoryBudgetsStr);
      await uploadCategoryBudgets(userId, categoryBudgets);
      
      // 업로드 성공 후 수정 추적 정보 초기화
      clearModifiedCategoryBudgets();
    } else {
      console.log('업로드할 카테고리 예산이 없음');
    }
    
    console.log('예산 데이터 업로드 완료');
  } catch (error) {
    console.error('예산 데이터 업로드 실패:', error);
    throw error;
  }
};

/**
 * 일반 예산 데이터 업로드
 */
async function uploadBudgetData(userId: string, parsedBudgetData: Record<string, any>): Promise<void> {
  console.log('예산 데이터 업로드:', parsedBudgetData);
  
  // 현재 월/년도 가져오기
  const now = new Date();
  const currentMonth = now.getMonth() + 1; // 0-11 -> 1-12
  const currentYear = now.getFullYear();
  
  // 기존 예산 데이터 확인
  const { data: existingBudgets, error: fetchError } = await supabase
    .from('budgets')
    .select('*')
    .eq('user_id', userId)
    .eq('month', currentMonth)
    .eq('year', currentYear);
    
  if (fetchError) {
    console.error('기존 예산 데이터 조회 실패:', fetchError);
    throw fetchError;
  }
  
  // 월간 타겟 금액 가져오기
  const monthlyTarget = parsedBudgetData.monthly.targetAmount;
  
  console.log('업로드할 월간 예산:', monthlyTarget);
  
  // 현재 타임스탬프
  const currentTimestamp = new Date().toISOString();
  
  // 업데이트 또는 삽입 결정
  if (existingBudgets && existingBudgets.length > 0) {
    // 기존 데이터 업데이트
    const { error } = await supabase
      .from('budgets')
      .update({
        total_budget: monthlyTarget,
        updated_at: currentTimestamp
      })
      .eq('id', existingBudgets[0].id);
      
    if (error) {
      console.error('예산 데이터 업데이트 실패:', error);
      throw error;
    }
    
    console.log('예산 데이터 업데이트 성공');
  } else {
    // 새 데이터 삽입
    const { error } = await supabase
      .from('budgets')
      .insert({
        user_id: userId,
        month: currentMonth,
        year: currentYear,
        total_budget: monthlyTarget,
        created_at: currentTimestamp,
        updated_at: currentTimestamp
      });
      
    if (error) {
      console.error('예산 데이터 삽입 실패:', error);
      throw error;
    }
    
    console.log('예산 데이터 삽입 성공');
  }
}

/**
 * 카테고리 예산 데이터 업로드
 */
async function uploadCategoryBudgets(userId: string, parsedCategoryBudgets: Record<string, number>): Promise<void> {
  console.log('카테고리 예산 업로드:', parsedCategoryBudgets);
  
  // 기존 카테고리 예산 삭제
  const { error: deleteError } = await supabase
    .from('category_budgets')
    .delete()
    .eq('user_id', userId);
    
  if (deleteError) {
    console.error('기존 카테고리 예산 삭제 실패:', deleteError);
    // 오류가 나도 계속 진행 (중요 데이터가 아니기 때문)
  }
  
  // 현재 타임스탬프
  const currentTimestamp = new Date().toISOString();
  
  // 카테고리별 예산 데이터 변환 및 삽입
  const categoryEntries = Object.entries(parsedCategoryBudgets)
    .filter(([_, amount]) => amount > 0) // 금액이 0보다 큰 것만 저장
    .map(([category, amount]) => ({
      user_id: userId,
      category,
      amount,
      created_at: currentTimestamp,
      updated_at: currentTimestamp
    }));
  
  if (categoryEntries.length > 0) {
    const { error } = await supabase
      .from('category_budgets')
      .insert(categoryEntries);
      
    if (error) {
      console.error('카테고리 예산 삽입 실패:', error);
      throw error;
    }
    
    console.log('카테고리 예산 삽입 성공:', categoryEntries.length, '개');
  } else {
    console.log('저장할 카테고리 예산이 없음');
  }
}
