
import { supabase } from '@/lib/supabase';
import { uploadBudgets, downloadBudgets } from './budget';
import { uploadTransactions, downloadTransactions } from './transaction';
import { setLastSyncTime } from './time';

export interface SyncResult {
  success: boolean;
  partial: boolean;
  uploadSuccess: boolean;
  downloadSuccess: boolean;
  details?: {
    budgetUpload?: boolean;
    budgetDownload?: boolean;
    transactionUpload?: boolean;
    transactionDownload?: boolean;
  };
}

/**
 * 모든 데이터를 동기화합니다 (업로드 우선 수행)
 */
export const syncAllData = async (userId: string): Promise<SyncResult> => {
  // 로컬 데이터 백업
  const backupBudgetData = localStorage.getItem('budgetData');
  const backupCategoryBudgets = localStorage.getItem('categoryBudgets');
  const backupTransactions = localStorage.getItem('transactions');
  
  const result: SyncResult = {
    success: false,
    partial: false,
    uploadSuccess: false,
    downloadSuccess: false,
    details: {
      budgetUpload: false,
      budgetDownload: false,
      transactionUpload: false,
      transactionDownload: false
    }
  };
  
  try {
    console.log('데이터 동기화 시작 - 사용자 ID:', userId);
    
    // 여기서는 업로드를 먼저 시도합니다 (로컬 데이터 보존을 위해)
    try {
      // 예산 데이터 업로드
      await uploadBudgets(userId);
      result.details!.budgetUpload = true;
      console.log('예산 업로드 성공');
      
      // 트랜잭션 데이터 업로드
      await uploadTransactions(userId);
      result.details!.transactionUpload = true;
      console.log('트랜잭션 업로드 성공');
      
      // 업로드 성공 설정
      result.uploadSuccess = true;
    } catch (uploadError) {
      console.error('데이터 업로드 실패:', uploadError);
      result.uploadSuccess = false;
    }
    
    // 그 다음 다운로드 시도
    try {
      // 서버에 데이터가 없는 경우를 확인하기 위해 먼저 데이터 유무 검사
      const { data: budgetData } = await supabase
        .from('budgets')
        .select('count')
        .eq('user_id', userId)
        .single();
        
      const { data: transactionsData } = await supabase
        .from('transactions')
        .select('count')
        .eq('user_id', userId)
        .single();
      
      // 서버에 데이터가 없지만 로컬에 데이터가 있는 경우, 다운로드를 건너뜀
      const serverHasData = (budgetData?.count || 0) > 0 || (transactionsData?.count || 0) > 0;
      
      if (!serverHasData && (backupBudgetData || backupTransactions)) {
        console.log('서버에 데이터가 없고 로컬 데이터가 있어 다운로드 건너뜀');
        result.downloadSuccess = true;
        result.details!.budgetDownload = true;
        result.details!.transactionDownload = true;
      } else {
        // 예산 데이터 다운로드
        await downloadBudgets(userId);
        result.details!.budgetDownload = true;
        console.log('예산 다운로드 성공');
        
        // 트랜잭션 데이터 다운로드  
        await downloadTransactions(userId);
        result.details!.transactionDownload = true;
        console.log('트랜잭션 다운로드 성공');
        
        // 다운로드 성공 설정
        result.downloadSuccess = true;
      }
    } catch (downloadError) {
      console.error('데이터 다운로드 실패:', downloadError);
      result.downloadSuccess = false;
      
      // 다운로드 실패 시 로컬 데이터 복원
      if (backupBudgetData) {
        localStorage.setItem('budgetData', backupBudgetData);
      }
      if (backupCategoryBudgets) {
        localStorage.setItem('categoryBudgets', backupCategoryBudgets);
      }
      if (backupTransactions) {
        localStorage.setItem('transactions', backupTransactions);
      }
      
      // UI 업데이트
      window.dispatchEvent(new Event('budgetDataUpdated'));
      window.dispatchEvent(new Event('categoryBudgetsUpdated'));
      window.dispatchEvent(new Event('transactionUpdated'));
    }
    
    // 부분 성공 여부 설정
    result.partial = (result.uploadSuccess || result.downloadSuccess) && !(result.uploadSuccess && result.downloadSuccess);
    
    // 전체 성공 여부 설정
    result.success = result.uploadSuccess || result.downloadSuccess;
    
    // 동기화 시간 기록
    if (result.success) {
      setLastSyncTime(new Date().toISOString());
    }
    
    console.log('데이터 동기화 결과:', result);
    return result;
  } catch (error) {
    console.error('데이터 동기화 중 치명적 오류:', error);
    
    // 백업 데이터 복원
    if (backupBudgetData) {
      localStorage.setItem('budgetData', backupBudgetData);
    }
    if (backupCategoryBudgets) {
      localStorage.setItem('categoryBudgets', backupCategoryBudgets);
    }
    if (backupTransactions) {
      localStorage.setItem('transactions', backupTransactions);
    }
    
    // UI 업데이트
    window.dispatchEvent(new Event('budgetDataUpdated'));
    window.dispatchEvent(new Event('categoryBudgetsUpdated'));
    window.dispatchEvent(new Event('transactionUpdated'));
    
    result.success = false;
    result.partial = false;
    result.uploadSuccess = false;
    result.downloadSuccess = false;
    
    return result;
  }
};

/**
 * 서버에 대한 안전한 동기화 래퍼
 * 오류 처리와 재시도 로직을 포함
 */
export const trySyncAllData = async (userId: string): Promise<SyncResult> => {
  console.log('안전한 데이터 동기화 시도');
  let attempts = 0;
  
  const trySync = async (): Promise<SyncResult> => {
    try {
      return await syncAllData(userId);
    } catch (error) {
      attempts++;
      console.error(`동기화 시도 ${attempts} 실패:`, error);
      
      if (attempts < 2) {
        console.log('동기화 재시도 중...');
        return trySync();
      }
      
      return {
        success: false,
        partial: false,
        uploadSuccess: false,
        downloadSuccess: false
      };
    }
  };
  
  return trySync();
};
