
import { Transaction } from '../types';
import { toast } from '@/components/ui/use-toast';

/**
 * 로컬 스토리지에서 트랜잭션 불러오기
 */
export const loadTransactionsFromStorage = (): Transaction[] => {
  try {
    // 메인 스토리지에서 먼저 시도
    const storedTransactions = localStorage.getItem('transactions');
    if (storedTransactions) {
      try {
        const parsedData = JSON.parse(storedTransactions);
        console.log('트랜잭션 로드 완료, 항목 수:', parsedData.length);
        
        // 트랜잭션 데이터 유효성 검사
        if (Array.isArray(parsedData)) {
          return parsedData;
        } else {
          console.error('트랜잭션 데이터가 배열이 아닙니다:', typeof parsedData);
          return [];
        }
      } catch (e) {
        console.error('트랜잭션 데이터 파싱 오류:', e);
      }
    }
    
    // 백업에서 시도
    const backupTransactions = localStorage.getItem('transactions_backup');
    if (backupTransactions) {
      try {
        const parsedBackup = JSON.parse(backupTransactions);
        console.log('백업에서 트랜잭션 복구, 항목 수:', parsedBackup.length);
        // 메인 스토리지도 복구
        localStorage.setItem('transactions', backupTransactions);
        return parsedBackup;
      } catch (e) {
        console.error('백업 트랜잭션 데이터 파싱 오류:', e);
      }
    }
  } catch (error) {
    console.error('트랜잭션 데이터 로드 중 오류:', error);
  }
  
  // 데이터가 없을 경우 빈 배열 반환
  console.log('트랜잭션 데이터 없음, 빈 배열 반환');
  return [];
};

/**
 * 트랜잭션 저장
 */
export const saveTransactionsToStorage = (transactions: Transaction[]): void => {
  try {
    console.log('트랜잭션 저장 시작, 항목 수:', transactions.length);
    
    // 먼저 문자열로 변환
    const dataString = JSON.stringify(transactions);
    
    // 로컬 스토리지에 저장 
    localStorage.setItem('transactions', dataString);
    // 백업 저장
    localStorage.setItem('transactions_backup', dataString);
    
    console.log('트랜잭션 저장 완료, 항목 수:', transactions.length);
    
    // 스토리지 이벤트 수동 트리거 (동일 창에서도 감지하기 위함)
    try {
      window.dispatchEvent(new Event('transactionUpdated'));
      window.dispatchEvent(new CustomEvent('transactionChanged', {
        detail: { type: 'save', count: transactions.length }
      }));
      window.dispatchEvent(new StorageEvent('storage', {
        key: 'transactions',
        newValue: dataString
      }));
    } catch (e) {
      console.error('이벤트 발생 오류:', e);
    }
    
    // 마지막 저장 시간 기록 (데이터 검증용)
    localStorage.setItem('lastTransactionSaveTime', new Date().toISOString());
  } catch (error) {
    console.error('트랜잭션 저장 오류:', error);
    
    // 오류 발생 시 토스트 알림
    toast({
      title: "지출 저장 실패",
      description: "지출 데이터를 저장하는데 문제가 발생했습니다.",
      variant: "destructive"
    });
  }
};

/**
 * 모든 트랜잭션 삭제
 */
export const clearAllTransactions = (): void => {
  try {
    localStorage.removeItem('transactions');
    localStorage.removeItem('transactions_backup');
    
    // 빈 배열을 저장하여 확실히 초기화
    const emptyData = JSON.stringify([]);
    localStorage.setItem('transactions', emptyData);
    localStorage.setItem('transactions_backup', emptyData);
    
    console.log('모든 트랜잭션이 삭제되었습니다.');
    
    // 스토리지 이벤트 수동 트리거
    window.dispatchEvent(new Event('transactionUpdated'));
    window.dispatchEvent(new CustomEvent('transactionChanged', {
      detail: { type: 'clear' }
    }));
    window.dispatchEvent(new StorageEvent('storage', {
      key: 'transactions',
      newValue: emptyData
    }));
    
    // 토스트 알림
    toast({
      title: "지출 내역 초기화",
      description: "모든 지출 내역이 삭제되었습니다.",
    });
  } catch (error) {
    console.error('트랜잭션 삭제 오류:', error);
    
    // 오류 발생 시 토스트 알림
    toast({
      title: "초기화 실패",
      description: "지출 내역을 초기화하는데 문제가 발생했습니다.",
      variant: "destructive"
    });
  }
};
