import { useState, useCallback, useEffect } from 'react';

import { BackupProgress } from '../types';

export function useBackupProgress(onComplete: () => void) {
    const [progress, setProgress] = useState<BackupProgress>({
        status: 'idle',
        percentage: 0,
        message: '',
        current_file: '',
        total_files: 0,
        processed_files: 0,
    });
    const [isPolling, setIsPolling] = useState(false);
    const [dialogOpen, setDialogOpen] = useState(false);
    const [pollInterval, setPollInterval] = useState<NodeJS.Timeout | null>(null);

    const fetchProgress = useCallback(async () => {
        try {
            const response = await fetch('/admin/backup/progress');
            const data = await response.json();
            setProgress(data);

            if (data.status === 'completed' || data.status === 'failed') {
                setIsPolling(false);
                if (pollInterval) {
                    clearInterval(pollInterval);
                    setPollInterval(null);
                }

                if (data.status === 'completed') {
                    setTimeout(() => {
                        setDialogOpen(false);
                        onComplete();
                    }, 3000);
                } else if (data.status === 'failed') {
                    setTimeout(() => {
                        setDialogOpen(false);
                        onComplete();
                    }, 5000);
                }
            }
        } catch (error) {
            console.error('Failed to fetch progress:', error);
        }
    }, [pollInterval, onComplete]);

    const startPolling = useCallback(() => {
        setIsPolling(true);
        setDialogOpen(true);
        setProgress({
            status: 'running',
            percentage: 0,
            message: 'Starting backup...',
            current_file: '',
            total_files: 0,
            processed_files: 0,
        });

        const interval = setInterval(fetchProgress, 1000);
        setPollInterval(interval);
    }, [fetchProgress]);

    const stopPolling = useCallback(() => {
        setIsPolling(false);
        if (pollInterval) {
            clearInterval(pollInterval);
            setPollInterval(null);
        }
    }, [pollInterval]);

    useEffect(() => {
        return () => {
            if (pollInterval) {
                clearInterval(pollInterval);
            }
        };
    }, [pollInterval]);

    return {
        progress,
        isPolling,
        dialogOpen,
        setDialogOpen,
        startPolling,
        stopPolling,
    };
}
