
import { supabase } from '@/lib/supabase';
import { Transaction } from '@/components/TransactionCard';
import { isSyncEnabled } from '../syncSettings';
import { formatDateForDisplay } from './dateUtils';
import { getDeletedTransactions } from './deletedTransactionsTracker';

/**
 * Download transaction data from Supabase to local storage
 * 서버에서 로컬 스토리지로 데이터 다운로드 (병합 방식)
 */
export const downloadTransactions = async (userId: string): Promise<void> => {
  if (!isSyncEnabled()) return;

  try {
    console.log('서버에서 트랜잭션 데이터 다운로드 시작');
    const { data, error } = await supabase
      .from('transactions')
      .select('*')
      .eq('user_id', userId);
      
    if (error) {
      console.error('트랜잭션 다운로드 실패:', error);
      throw error;
    }
    
    if (!data || data.length === 0) {
      console.log('서버에 저장된 트랜잭션 없음');
      return; // 서버에 데이터가 없으면 로컬 데이터 유지
    }
    
    console.log(`서버에서 ${data.length}개의 트랜잭션 다운로드`);
    
    // 삭제된 트랜잭션 ID 목록 가져오기
    const deletedIds = getDeletedTransactions();
    console.log(`[동기화] 삭제된 트랜잭션 ${deletedIds.length}개 필터링 적용`);
    
    // 서버 데이터를 로컬 형식으로 변환 (삭제된 항목 제외)
    const serverTransactions = data
      .filter(t => {
        const transactionId = t.transaction_id || t.id;
        const isDeleted = deletedIds.includes(transactionId);
        if (isDeleted) {
          console.log(`[동기화] 삭제된 트랜잭션 필터링: ${transactionId}`);
        }
        return !isDeleted; // 삭제된 항목 제외
      })
      .map(t => {
        // 날짜 형식 변환 시 오류 방지 처리
        let formattedDate = '날짜 없음';
        try {
          if (t.date) {
            // ISO 형식이 아닌 경우 기본 변환 수행
            if (!t.date.match(/^\d{4}-\d{2}-\d{2}T/)) {
              console.log(`비표준 날짜 형식 감지: ${t.date}, ID: ${t.transaction_id || t.id}`);
              // 유효한 Date 객체로 변환 가능한지 확인
              const testDate = new Date(t.date);
              if (isNaN(testDate.getTime())) {
                console.warn(`잘못된 날짜 형식 감지, 현재 날짜 사용: ${t.date}`);
                t.date = new Date().toISOString(); // 잘못된 날짜는 현재 날짜로 대체
              }
            }
            formattedDate = formatDateForDisplay(t.date);
          }
        } catch (err) {
          console.error(`날짜 변환 오류 (ID: ${t.transaction_id || t.id}):`, err);
          // 오류 발생 시 기본값 사용
          formattedDate = new Date().toLocaleString('ko-KR');
        }
        
        return {
          id: t.transaction_id || t.id,
          title: t.title,
          amount: t.amount,
          date: formattedDate,
          category: t.category,
          type: t.type,
          notes: t.notes
        };
      });
    
    // 기존 로컬 데이터 불러오기
    const localDataStr = localStorage.getItem('transactions');
    const localTransactions = localDataStr ? JSON.parse(localDataStr) : [];
    
    // 로컬 데이터와 서버 데이터 병합 (ID 기준)
    const transactionMap = new Map();
    
    // 로컬 데이터를 맵에 추가
    localTransactions.forEach((tx: Transaction) => {
      transactionMap.set(tx.id, tx);
    });
    
    // 서버 데이터로 맵 업데이트 (서버 데이터 우선)
    serverTransactions.forEach(tx => {
      transactionMap.set(tx.id, tx);
    });
    
    // 최종 병합된 데이터 생성
    const mergedTransactions = Array.from(transactionMap.values());
    
    // 로컬 스토리지에 저장
    localStorage.setItem('transactions', JSON.stringify(mergedTransactions));
    console.log(`총 ${mergedTransactions.length}개의 트랜잭션 병합 완료`);
    
    // 이벤트 발생시켜 UI 업데이트
    window.dispatchEvent(new Event('transactionUpdated'));
  } catch (error) {
    console.error('트랜잭션 다운로드 중 오류:', error);
    throw error;
  }
};
