
/**
 * 카테고리 예산 업로드 기능
 */
import { supabase } from '@/lib/supabase';
import { CategoryBudgets, CategoryBudgetRecord } from './types';
import { calculateTotalCategoryBudget, filterValidCategoryBudgets } from './validators';

/**
 * 카테고리 예산 데이터 업로드
 */
export async function uploadCategoryBudgets(userId: string, parsedCategoryBudgets: CategoryBudgets): Promise<boolean> {
  console.log('카테고리 예산 업로드:', parsedCategoryBudgets);
  
  // 기존 카테고리 예산 확인
  const { data: existingCategoryBudgets, error: fetchError } = await supabase
    .from('category_budgets')
    .select('*')
    .eq('user_id', userId);
    
  if (fetchError) {
    console.error('기존 카테고리 예산 조회 실패:', fetchError);
    throw fetchError;
  }
  
  // 기존 카테고리 예산의 총액 계산
  let existingTotal = 0;
  if (existingCategoryBudgets && existingCategoryBudgets.length > 0) {
    existingTotal = existingCategoryBudgets.reduce((sum, item) => {
      return sum + (typeof item.amount === 'number' ? item.amount : 0);
    }, 0);
  }
  
  // 새 카테고리 예산의 총액 계산
  const newTotal = calculateTotalCategoryBudget(parsedCategoryBudgets);
  
  // 새 카테고리 예산 총액이 기존 카테고리 예산 총액보다 작거나 같으면 업로드 건너뜀
  if (newTotal <= existingTotal && existingTotal > 0) {
    console.log(`새 카테고리 예산 총액(${newTotal})이 기존 예산 총액(${existingTotal})보다 작거나 같음, 업로드 건너뜀`);
    return false;
  }
  
  // 새 카테고리 예산 총액이 0이면 업로드 건너뜀
  if (newTotal <= 0) {
    console.log('새 카테고리 예산 총액이 0이하여서 업로드 건너뜀');
    return false;
  }
  
  console.log(`새 카테고리 예산 총액(${newTotal})이 기존 예산 총액(${existingTotal})보다 큼, 업로드 실행`);
  
  // 기존 카테고리 예산 삭제
  const { error: deleteError } = await supabase
    .from('category_budgets')
    .delete()
    .eq('user_id', userId);
    
  if (deleteError) {
    console.error('기존 카테고리 예산 삭제 실패:', deleteError);
    // 오류가 나도 계속 진행 (중요 데이터가 아니기 때문)
  }
  
  // 현재 타임스탬프
  const currentTimestamp = new Date().toISOString();
  
  // 카테고리별 예산 데이터 변환 및 삽입
  const validCategoryBudgets = filterValidCategoryBudgets(parsedCategoryBudgets);
  const categoryEntries: CategoryBudgetRecord[] = Object.entries(validCategoryBudgets)
    .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, '개');
    return true;
  } else {
    console.log('저장할 카테고리 예산이 없음');
    return false;
  }
}
