
import { DEFAULT_CATEGORY_BUDGETS } from '../budgetUtils';
import { EXPENSE_CATEGORIES } from '@/constants/categoryIcons';
import { toast } from '@/hooks/useToast.wrapper'; // 래퍼 사용

/**
 * 카테고리 예산 불러오기
 */
export const loadCategoryBudgetsFromStorage = (): Record<string, number> => {
  try {
    // 메인 스토리지에서 시도
    const storedCategoryBudgets = localStorage.getItem('categoryBudgets');
    if (storedCategoryBudgets) {
      const parsed = JSON.parse(storedCategoryBudgets);
      console.log('카테고리 예산 로드 완료:', parsed);
      
      // 3개 카테고리만 유지
      const filteredBudgets: Record<string, number> = {};
      EXPENSE_CATEGORIES.forEach(category => {
        filteredBudgets[category] = parsed[category] || 0;
      });
      
      return filteredBudgets;
    }
    
    // 백업에서 시도
    const backupCategoryBudgets = localStorage.getItem('categoryBudgets_backup');
    if (backupCategoryBudgets) {
      const parsedBackup = JSON.parse(backupCategoryBudgets);
      console.log('백업에서 카테고리 예산 복구:', parsedBackup);
      
      // 3개 카테고리만 유지
      const filteredBudgets: Record<string, number> = {};
      EXPENSE_CATEGORIES.forEach(category => {
        filteredBudgets[category] = parsedBackup[category] || 0;
      });
      
      // 메인 스토리지도 복구
      localStorage.setItem('categoryBudgets', JSON.stringify(filteredBudgets));
      return filteredBudgets;
    }
  } catch (error) {
    console.error('카테고리 예산 데이터 파싱 오류:', error);
  }
  
  // 새 사용자를 위한 기본 카테고리 예산 저장
  console.log('기본 카테고리 예산 설정');
  saveCategoryBudgetsToStorage(DEFAULT_CATEGORY_BUDGETS);
  return DEFAULT_CATEGORY_BUDGETS;
};

/**
 * 카테고리 예산 저장
 */
export const saveCategoryBudgetsToStorage = (categoryBudgets: Record<string, number>): void => {
  try {
    // 이전 예산과 비교하여 변경 여부 확인
    let hasChanged = true;
    try {
      const oldDataString = localStorage.getItem('categoryBudgets');
      if (oldDataString) {
        const oldData = JSON.parse(oldDataString);
        // 총 예산이 동일하면 변경되지 않은 것으로 판단
        const oldTotal = Object.values(oldData).reduce((sum: number, val: number) => sum + val, 0);
        const newTotal = Object.values(categoryBudgets).reduce((sum: number, val: number) => sum + val, 0);
        hasChanged = oldTotal !== newTotal;
      }
    } catch (e) {
      console.error('이전 카테고리 예산 비교 오류:', e);
    }
    
    // 3개 카테고리만 유지하고 나머지는 제거
    const filteredBudgets: Record<string, number> = {};
    EXPENSE_CATEGORIES.forEach(category => {
      filteredBudgets[category] = categoryBudgets[category] || 0;
    });
    
    // 데이터 문자열로 변환
    const dataString = JSON.stringify(filteredBudgets);
    
    // 로컬 스토리지에 저장
    localStorage.setItem('categoryBudgets', dataString);
    // 백업 저장
    localStorage.setItem('categoryBudgets_backup', dataString);
    
    console.log('카테고리 예산 저장 완료:', filteredBudgets);
    
    // 단일 이벤트로 통합
    const event = new CustomEvent('categoryBudgetsChanged', {
      detail: { data: filteredBudgets, hasChanged }
    });
    window.dispatchEvent(event);
    
    // 마지막 저장 시간 기록 (데이터 검증용)
    localStorage.setItem('lastCategoryBudgetSaveTime', new Date().toISOString());
    
    // 토스트 알림 (변경된 경우에만)
    const totalBudget = Object.values(filteredBudgets).reduce((sum, val) => sum + val, 0);
    if (hasChanged && totalBudget > 0) {
      toast({
        title: "카테고리 예산 저장 완료",
        description: `카테고리별 예산 총 ${totalBudget.toLocaleString()}원이 설정되었습니다.`,
      });
    }
  } catch (error) {
    console.error('카테고리 예산 저장 오류:', error);
    
    // 오류 발생 시 토스트 알림
    toast({
      title: "카테고리 예산 저장 실패",
      description: "카테고리 예산을 저장하는데 문제가 발생했습니다.",
      variant: "destructive"
    });
  }
};

/**
 * 모든 카테고리 예산 삭제
 */
export const clearAllCategoryBudgets = (): void => {
  try {
    localStorage.removeItem('categoryBudgets');
    localStorage.removeItem('categoryBudgets_backup');
    
    // 기본값으로 재설정 (3개 카테고리만)
    const dataString = JSON.stringify(DEFAULT_CATEGORY_BUDGETS);
    localStorage.setItem('categoryBudgets', dataString);
    localStorage.setItem('categoryBudgets_backup', dataString);
    
    console.log('카테고리 예산이 초기화되었습니다.');
    
    // 이벤트 발생
    window.dispatchEvent(new Event('categoryBudgetsUpdated'));
    window.dispatchEvent(new StorageEvent('storage', {
      key: 'categoryBudgets',
      newValue: dataString
    }));
    
    // 토스트 알림
    toast({
      title: "카테고리 예산 초기화",
      description: "모든 카테고리 예산이 기본값으로 초기화되었습니다.",
    });
  } catch (error) {
    console.error('카테고리 예산 삭제 오류:', error);
    
    // 오류 발생 시 토스트 알림
    toast({
      title: "초기화 실패",
      description: "카테고리 예산을 초기화하는데 문제가 발생했습니다.",
      variant: "destructive"
    });
  }
};
