
import { useCallback } from 'react';
import { Transaction } from '@/components/TransactionCard';
import { useAuth } from '@/contexts/auth/useAuth';
import { toast } from '@/hooks/useToast.wrapper';
import { saveTransactionsToStorage } from './storageUtils';
import { deleteTransactionFromSupabase } from './supabaseUtils';
import { addToDeletedTransactions } from '@/utils/sync/transaction/deletedTransactionsTracker';

/**
 * 트랜잭션 삭제 기능을 위한 훅
 */
export const useDeleteTransaction = (
  transactions: Transaction[],
  setTransactions: React.Dispatch<React.SetStateAction<Transaction[]>>
) => {
  const { user } = useAuth();

  /**
   * 트랜잭션 삭제 처리
   */
  const deleteTransaction = useCallback(async (transactionId: string): Promise<boolean> => {
    try {
      console.log(`[트랜잭션 삭제] 시작: ID=${transactionId}`);
      
      // 트랜잭션 존재 확인
      const transaction = transactions.find(t => t.id === transactionId);
      if (!transaction) {
        console.warn(`[트랜잭션 삭제] 트랜잭션을 찾을 수 없음: ${transactionId}`);
        return false;
      }
      
      console.log(`[트랜잭션 삭제] 삭제 대상: "${transaction.title}", 금액: ${transaction.amount}원`);
      
      // 트랜잭션 목록에서 제거
      const updatedTransactions = transactions.filter(t => t.id !== transactionId);
      
      // 로컬 스토리지 업데이트
      saveTransactionsToStorage(updatedTransactions);
      console.log(`[트랜잭션 삭제] 로컬 저장소 업데이트 완료`);
      
      // 상태 업데이트
      setTransactions(updatedTransactions);
      
      // 클라우드 동기화 (Supabase)
      if (user) {
        try {
          console.log(`[트랜잭션 삭제] Supabase 삭제 시작: ${transactionId}`);
          await deleteTransactionFromSupabase(user, transactionId);
          console.log(`[트랜잭션 삭제] Supabase 삭제 성공: ${transactionId}`);
        } catch (syncError) {
          console.error(`[트랜잭션 삭제] Supabase 삭제 실패:`, syncError);
          // 삭제 실패하더라도 로컬에서는 삭제됨, 추적 목록에 추가
          addToDeletedTransactions(transactionId);
          console.log(`[트랜잭션 삭제] 삭제 트랜잭션 추적 목록에 추가: ${transactionId}`);
        }
      } else {
        // 오프라인 상태이거나 로그인되지 않은 경우 추적 목록에 추가
        addToDeletedTransactions(transactionId);
        console.log(`[트랜잭션 삭제] 오프라인 삭제: 추적 목록에 추가 ${transactionId}`);
      }
      
      // 이벤트 발생
      window.dispatchEvent(new Event('transactionUpdated'));
      window.dispatchEvent(new CustomEvent('transactionDeleted', { 
        detail: { id: transactionId } 
      }));
      
      // 토스트 메시지 표시
      toast({
        title: "지출이 삭제되었습니다",
        description: `${transaction.title} 항목이 삭제되었습니다.`,
        duration: 3000
      });
      
      console.log(`[트랜잭션 삭제] 완료: ${transactionId}`);
      return true;
    } catch (error) {
      console.error(`[트랜잭션 삭제] 오류 발생:`, error);
      toast({
        title: "삭제 실패",
        description: "지출 항목 삭제 중 오류가 발생했습니다.",
        variant: "destructive"
      });
      return false;
    }
  }, [transactions, setTransactions, user]);

  return { deleteTransaction };
};
