
import { supabase } from '@/lib/supabase';
import { isSyncEnabled } from '../syncSettings';
import { addToDeletedTransactions } from './deletedTransactionsTracker';

/**
 * Supabase 서버에서 트랜잭션을 삭제하는 함수 - 안정성 및 성능 최적화 버전
 * 네트워크 타임아웃과 에러 처리를 강화하였습니다.
 */
export const deleteTransactionFromServer = async (userId: string, transactionId: string): Promise<void> => {
  // 동기화 기능이 비활성화된 경우 빠르게 종료
  if (!isSyncEnabled()) return;
  
  try {
    console.log(`[서버 삭제] 요청 시작: ${transactionId}`);
    
    // 타임아웃 설정 (2초)
    const controller = new AbortController();
    const timeoutId = setTimeout(() => {
      console.warn(`[서버 삭제] 타임아웃 발생: ${transactionId}`);
      controller.abort();
    }, 2000);
    
    try {
      // 삭제된 트랜잭션 ID 추적 목록에 추가
      addToDeletedTransactions(transactionId);
      
      // 서버 요청 실행
      const { error } = await supabase
        .from('transactions')
        .delete()
        .eq('transaction_id', transactionId)
        .eq('user_id', userId)
        .abortSignal(controller.signal);
      
      // 타임아웃 제거
      clearTimeout(timeoutId);
      
      if (error) {
        console.error('[서버 삭제] 실패:', error.message);
      } else {
        console.log(`[서버 삭제] 성공: ${transactionId}`);
      }
    } catch (e) {
      // 타임아웃 오류 처리
      clearTimeout(timeoutId);
      
      const error = e as Error;
      if (error.name === 'AbortError') {
        console.warn('[서버 삭제] 요청이 타임아웃으로 중단됨');
      } else {
        console.error('[서버 삭제] 오류 발생:', error);
      }
    }
  } catch (error) {
    console.error('[서버 삭제] 예상치 못한 오류:', error);
  }
};

/**
 * 재시도 메커니즘이 포함된 트랜잭션 삭제 함수
 * 최대 2회까지 재시도하며 네트워크 불안정 상황에서 안정성을 높입니다.
 */
export const deleteTransactionWithRetry = async (
  userId: string, 
  transactionId: string, 
  maxRetries = 2
): Promise<boolean> => {
  let retries = 0;
  
  const attemptDelete = async (): Promise<boolean> => {
    try {
      await deleteTransactionFromServer(userId, transactionId);
      return true;
    } catch (error) {
      if (retries < maxRetries) {
        retries++;
        console.log(`[서버 삭제] 재시도 ${retries}/${maxRetries}: ${transactionId}`);
        
        // 지수 백오프 적용 (첫 재시도: 500ms, 두번째: 1000ms)
        await new Promise(resolve => setTimeout(resolve, 500 * retries));
        return attemptDelete();
      } else {
        console.warn(`[서버 삭제] 최대 재시도 횟수 초과: ${transactionId}`);
        return false;
      }
    }
  };
  
  return attemptDelete();
};
