
import { BudgetData } from '../types';
import { getInitialBudgetData } from '../budgetUtils';
import { toast } from '@/hooks/useToast.wrapper'; // 래퍼 사용

/**
 * 예산 데이터 불러오기
 */
export const loadBudgetDataFromStorage = (): BudgetData => {
  try {
    const storedBudgetData = localStorage.getItem('budgetData');
    if (storedBudgetData) {
      try {
        const parsed = JSON.parse(storedBudgetData);
        console.log('예산 데이터 로드 완료', parsed);
        
        // 데이터 유효성 검사 추가
        if (!parsed || !parsed.monthly || !parsed.daily || !parsed.weekly) {
          console.warn('불완전한 예산 데이터, 백업에서 복구 시도');
          throw new Error('잘못된 형식의 예산 데이터');
        }
        
        return parsed;
      } catch (error) {
        console.error('예산 데이터 파싱 오류:', error);
        
        // 백업에서 복구 시도
        const backupData = localStorage.getItem('budgetData_backup');
        if (backupData) {
          try {
            const parsed = JSON.parse(backupData);
            console.log('백업에서 예산 데이터 복구 완료', parsed);
            
            // 백업 데이터 유효성 검사
            if (!parsed || !parsed.monthly || !parsed.daily || !parsed.weekly) {
              console.warn('백업 예산 데이터도 불완전함, 새 데이터 생성');
              throw new Error('백업 데이터도 잘못된 형식');
            }
            
            localStorage.setItem('budgetData', backupData); // 메인 스토리지에 복구
            return parsed;
          } catch (backupError) {
            console.error('백업 데이터 복구 실패:', backupError);
          }
        }
      }
    }
  } catch (error) {
    console.error('예산 데이터 로드 중 오류:', error);
  }
  
  // 새 사용자를 위한 기본 예산 데이터 저장
  console.log('기본 예산 데이터 설정');
  const initialData = getInitialBudgetData();
  saveBudgetDataToStorage(initialData);
  return initialData;
};

/**
 * 예산 데이터 저장
 */
export const saveBudgetDataToStorage = (budgetData: BudgetData): void => {
  try {
    // 유효성 검사
    if (!budgetData || !budgetData.monthly || !budgetData.daily || !budgetData.weekly) {
      console.error('잘못된 예산 데이터 저장 시도:', budgetData);
      throw new Error('잘못된 예산 데이터');
    }
    
    // 데이터 문자열로 변환
    const dataString = JSON.stringify(budgetData);
    
    // 이전 예산과 비교하여 변경 여부 확인
    let hasChanged = true;
    try {
      const oldDataString = localStorage.getItem('budgetData');
      if (oldDataString) {
        const oldData = JSON.parse(oldDataString);
        // 월간 예산이 동일하면 변경되지 않은 것으로 판단
        hasChanged = oldData.monthly.targetAmount !== budgetData.monthly.targetAmount;
      }
    } catch (e) {
      console.error('이전 예산 비교 오류:', e);
    }
    
    // 로컬 스토리지에 저장
    localStorage.setItem('budgetData', dataString);
    console.log('예산 데이터 저장 완료', budgetData);
    
    // 중요: 즉시 자동 백업 (데이터 손실 방지)
    localStorage.setItem('budgetData_backup', dataString);
    localStorage.setItem('lastBudgetSaveTime', new Date().toISOString());
    
    // 이벤트 발생 (단일 이벤트로 통합)
    const event = new CustomEvent('budgetChanged', { 
      detail: { data: budgetData, hasChanged }
    });
    window.dispatchEvent(event);
    
    // toast 알림 (변경된 경우에만)
    if (hasChanged && budgetData.monthly.targetAmount > 0) {
      toast({
        title: "예산 저장 완료",
        description: `월 예산이 ${budgetData.monthly.targetAmount.toLocaleString()}원으로 설정되었습니다.`,
      });
    }
  } catch (error) {
    console.error('예산 데이터 저장 오류:', error);
    
    // 오류 발생 시 토스트 알림
    toast({
      title: "예산 저장 실패",
      description: "예산 데이터를 저장하는데 문제가 발생했습니다.",
      variant: "destructive"
    });
  }
};

/**
 * 모든 예산 데이터 삭제
 */
export const clearAllBudgetData = (): void => {
  try {
    localStorage.removeItem('budgetData');
    localStorage.removeItem('budgetData_backup');
    
    // 기본값으로 재설정
    const initialData = getInitialBudgetData();
    const dataString = JSON.stringify(initialData);
    localStorage.setItem('budgetData', dataString);
    localStorage.setItem('budgetData_backup', dataString);
    
    console.log('예산 데이터가 초기화되었습니다.');
    
    // 이벤트 발생
    window.dispatchEvent(new Event('budgetDataUpdated'));
    window.dispatchEvent(new StorageEvent('storage', {
      key: 'budgetData',
      newValue: dataString
    }));
    
    // 토스트 알림 (사용자가 직접 초기화한 경우만)
    const isUserInitiated = document.visibilityState === 'visible';
    if (isUserInitiated) {
      toast({
        title: "예산 초기화",
        description: "모든 예산 데이터가 초기화되었습니다.",
      });
    }
  } catch (error) {
    console.error('예산 데이터 삭제 오류:', error);
    toast({
      title: "초기화 실패",
      description: "예산 데이터를 초기화하는데 문제가 발생했습니다.",
      variant: "destructive"
    });
  }
};
