
import React, { useState, useRef, useEffect } from 'react';
import { Button } from '@/components/ui/button';
import { Trash2, Loader2 } from 'lucide-react';
import {
  AlertDialog,
  AlertDialogAction,
  AlertDialogCancel,
  AlertDialogContent,
  AlertDialogDescription,
  AlertDialogFooter,
  AlertDialogHeader,
  AlertDialogTitle,
  AlertDialogTrigger
} from '@/components/ui/alert-dialog';

interface TransactionDeleteAlertProps {
  onDelete: () => Promise<boolean> | boolean;
}

/**
 * 트랜잭션 삭제 확인 다이얼로그 - 완전히 개선된 버전
 * 삭제 중복 방지, 상태 관리 개선, 메모리 누수 방지 로직 추가
 */
const TransactionDeleteAlert: React.FC<TransactionDeleteAlertProps> = ({ onDelete }) => {
  const [isOpen, setIsOpen] = useState(false);
  const [isDeleting, setIsDeleting] = useState(false);
  
  // 타임아웃 참조 저장 (메모리 누수 방지용)
  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
  
  // 클린업 함수 - 메모리 누수 방지
  const clearTimeouts = () => {
    if (timeoutRef.current) {
      clearTimeout(timeoutRef.current);
      timeoutRef.current = null;
    }
  };
  
  // 컴포넌트 언마운트 시 모든 타임아웃 제거
  useEffect(() => {
    return () => {
      clearTimeouts();
    };
  }, []);
  
  const handleDelete = async () => {
    // 이미 삭제 중이면 중복 실행 방지
    if (isDeleting) return;
    
    try {
      // 삭제 상태 활성화
      setIsDeleting(true);
      
      // 다이얼로그 즉시 닫기 (UI 응답성 개선)
      setIsOpen(false);
      
      // UI 애니메이션 완료 후 삭제 실행
      timeoutRef.current = setTimeout(async () => {
        try {
          // 삭제 함수 실행
          await onDelete();
        } catch (error) {
          console.error('삭제 처리 오류:', error);
        } finally {
          // 모든 작업 완료 후 상태 초기화 (약간 지연)
          timeoutRef.current = setTimeout(() => {
            setIsDeleting(false);
          }, 100);
        }
      }, 150);
    } catch (error) {
      console.error('삭제 핸들러 오류:', error);
      setIsDeleting(false);
      setIsOpen(false);
    }
  };
  
  return (
    <AlertDialog open={isOpen} onOpenChange={(open) => {
      // 삭제 중에는 상태 변경 방지
      if (isDeleting && !open) return;
      setIsOpen(open);
    }}>
      <AlertDialogTrigger asChild>
        <Button 
          type="button" 
          variant="outline"
          className="border-red-200 text-red-500 hover:bg-red-50"
        >
          <Trash2 size={16} className="mr-1" />
          삭제
        </Button>
      </AlertDialogTrigger>
      <AlertDialogContent>
        <AlertDialogHeader>
          <AlertDialogTitle>지출 삭제</AlertDialogTitle>
          <AlertDialogDescription>
            정말로 이 지출 항목을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.
          </AlertDialogDescription>
        </AlertDialogHeader>
        <AlertDialogFooter>
          <AlertDialogCancel disabled={isDeleting}>취소</AlertDialogCancel>
          <Button 
            className="bg-red-500 hover:bg-red-600"
            onClick={handleDelete}
            disabled={isDeleting}
          >
            {isDeleting ? (
              <>
                <Loader2 size={16} className="mr-1 animate-spin" />
                처리 중...
              </>
            ) : (
              <>
                <Trash2 size={16} className="mr-1" />
                삭제
              </>
            )}
          </Button>
        </AlertDialogFooter>
      </AlertDialogContent>
    </AlertDialog>
  );
};

export default TransactionDeleteAlert;
