
/**
 * 데이터 동기화 메인 모듈
 */
import { isSyncEnabled } from './config';
import { setLastSyncTime } from '../syncUtils';
import { 
  BackupData, 
  SyncResult,
  backupLocalData,
  recoverFromSyncError,
  checkDataStatus,
  performUpload,
  performDownload,
  createSyncResult
} from './core';

/**
 * 모든 데이터를 동기화합니다 (서버/로컬 상태에 따라 업로드/다운로드 순서 결정)
 */
export const syncAllData = async (userId: string): Promise<SyncResult> => {
  // 로컬 데이터 백업
  const backup: BackupData = backupLocalData();
  
  // 기본 결과 객체 생성
  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);
    
    // 동기화 기능이 활성화되어 있는지 확인
    if (!isSyncEnabled()) {
      console.log('동기화가 비활성화되어 있어 작업을 건너뜁니다.');
      return result;
    }
    
    // 서버와 로컬 데이터 상태 확인
    const status = await checkDataStatus(userId);
    console.log('데이터 존재 여부:', {
      서버: {
        예산: status.server.hasBudgetData, 
        거래: status.server.hasTransactionData
      },
      로컬: {
        예산: status.local.hasBudgetData, 
        거래: status.local.hasTransactionData
      }
    });
    
    // 동기화 전략 결정 - 서버에 데이터가 없고 로컬에 데이터가 있으면 업로드 먼저
    if (!status.server.hasData && status.local.hasData) {
      console.log('서버에 데이터가 없고 로컬에 데이터가 있어 업로드 우선 실행');
      
      // 업로드 수행
      const uploadResult = await performUpload(userId);
      result.uploadSuccess = uploadResult.budgetUpload || uploadResult.transactionUpload;
      result.details!.budgetUpload = uploadResult.budgetUpload;
      result.details!.transactionUpload = uploadResult.transactionUpload;
      
    } 
    // 서버에 데이터가 있으면 다운로드 먼저
    else if (status.server.hasData) {
      console.log('서버에 데이터가 있어 다운로드 우선 실행');
      
      // 다운로드 수행
      const downloadResult = await performDownload(userId);
      result.downloadSuccess = downloadResult.budgetDownload || downloadResult.transactionDownload;
      result.details!.budgetDownload = downloadResult.budgetDownload;
      result.details!.transactionDownload = downloadResult.transactionDownload;
      
      // 다운로드 후 로컬 데이터 있으면 추가 업로드 시도
      if (result.downloadSuccess && status.local.hasData) {
        console.log('다운로드 후 로컬 데이터 업로드 시도');
        
        // 업로드 수행
        const uploadResult = await performUpload(userId);
        result.uploadSuccess = uploadResult.budgetUpload || uploadResult.transactionUpload;
        result.details!.budgetUpload = uploadResult.budgetUpload;
        result.details!.transactionUpload = uploadResult.transactionUpload;
      }
    }
    // 양쪽 다 데이터가 없는 경우
    else {
      console.log('서버와 로컬 모두 데이터가 없어 동기화 건너뜀');
      result.uploadSuccess = true;
      result.downloadSuccess = true;
      result.details!.budgetUpload = true;
      result.details!.budgetDownload = true;
      result.details!.transactionUpload = true;
      result.details!.transactionDownload = true;
    }
    
    // 부분 성공 여부 설정
    result.partial = (result.uploadSuccess || result.downloadSuccess) && !(result.uploadSuccess && result.downloadSuccess);
    
    // 전체 성공 여부 설정
    result.success = result.uploadSuccess || result.downloadSuccess;
    
    // 동기화 시간 기록 - 추가 디버깅 로그 및 중요 부분
    if (result.success) {
      const currentTime = new Date().toISOString();
      console.log('동기화 성공, 시간 업데이트:', currentTime);
      setLastSyncTime(currentTime);
    } else {
      console.log('동기화 실패, 시간 업데이트 안함');
    }
    
    console.log('데이터 동기화 결과:', result);
    return result;
  } catch (error) {
    // 오류 발생 시 백업 데이터 복원
    console.error('동기화 중 오류 발생:', error);
    recoverFromSyncError(backup, error);
    
    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();
};

// SyncResult 타입 다시 내보내기 (기존 가져오는 코드와의 호환성)
export type { SyncResult } from './core';
