
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 { updateTransactionInSupabase } from '../supabaseUtils';
import { TransactionOperationProps } from './types';
import { normalizeDate } from '@/utils/sync/transaction/dateUtils';

/**
 * 트랜잭션 업데이트 기능
 * 로컬 스토리지와 Supabase에 트랜잭션을 업데이트합니다.
 */
export const useUpdateTransaction = (
  transactions: Transaction[],
  setTransactions: React.Dispatch<React.SetStateAction<Transaction[]>>
) => {
  const { user } = useAuth();

  return useCallback((updatedTransaction: Transaction) => {
    try {
      console.log(`[트랜잭션] 업데이트 시작: ID=${updatedTransaction.id}, 제목=${updatedTransaction.title}`);
      
      // 트랜잭션 존재 여부 확인
      const existingIndex = transactions.findIndex(t => t.id === updatedTransaction.id);
      if (existingIndex === -1) {
        console.warn(`[트랜잭션] 업데이트 오류: ID ${updatedTransaction.id}를 찾을 수 없음`);
        toast({
          title: "업데이트 실패",
          description: "해당 지출 항목을 찾을 수 없습니다.",
          variant: "destructive"
        });
        return;
      }
      
      // 기존 데이터와 변경 감지
      const oldTransaction = transactions[existingIndex];
      const hasChanges = JSON.stringify(oldTransaction) !== JSON.stringify(updatedTransaction);
      
      if (!hasChanges) {
        console.log(`[트랜잭션] 변경사항 없음: ${updatedTransaction.id}`);
        return;
      }
      
      // 변경 내용 로깅
      console.log(`[트랜잭션] 변경 감지:
        제목: ${oldTransaction.title} -> ${updatedTransaction.title}
        금액: ${oldTransaction.amount} -> ${updatedTransaction.amount}
        카테고리: ${oldTransaction.category} -> ${updatedTransaction.category}
        날짜: ${oldTransaction.date} -> ${updatedTransaction.date}
      `);
      
      // 로컬 스토리지 업데이트
      const updatedTransactions = transactions.map(transaction =>
        transaction.id === updatedTransaction.id ? updatedTransaction : transaction
      );
      
      saveTransactionsToStorage(updatedTransactions);
      console.log(`[트랜잭션] 로컬 저장소 업데이트 완료`);
      
      // 상태 업데이트
      setTransactions(updatedTransactions);
      
      // Supabase 업데이트 시도 (날짜 형식 변환 추가)
      if (user) {
        // ISO 형식으로 날짜 변환
        const transactionWithIsoDate = {
          ...updatedTransaction,
          dateForSync: normalizeDate(updatedTransaction.date)
        };
        
        console.log(`[트랜잭션] Supabase 업데이트 시작: ${updatedTransaction.id}`);
        updateTransactionInSupabase(user, transactionWithIsoDate)
          .then(() => {
            console.log(`[트랜잭션] Supabase 업데이트 성공: ${updatedTransaction.id}`);
          })
          .catch(err => {
            console.error(`[트랜잭션] Supabase 업데이트 실패:`, err);
          });
      } else {
        console.log(`[트랜잭션] 로그인 상태 아님: Supabase 업데이트 건너뜀`);
      }
      
      // 이벤트 발생
      window.dispatchEvent(new Event('transactionUpdated'));
      
      // 약간의 지연을 두고 토스트 표시
      setTimeout(() => {
        toast({
          title: "지출이 수정되었습니다",
          description: `${updatedTransaction.title} 항목이 업데이트되었습니다.`,
          duration: 3000
        });
      }, 100);
    } catch (error) {
      console.error(`[트랜잭션] 업데이트 중 오류 발생:`, error);
      toast({
        title: "업데이트 실패",
        description: "지출 수정 중 오류가 발생했습니다.",
        variant: "destructive"
      });
    }
  }, [transactions, setTransactions, user]);
};
