import { useState } from 'react';
import { router } from '@inertiajs/react';
import { Backup } from '../types';

export function useBackupOperations(
    startPolling: () => void,
    stopPolling: () => void
) {
    const [backingUp, setBackingUp] = useState(false);
    const [importing, setImporting] = useState(false);
    const [deletingBackupId, setDeletingBackupId] = useState<number | null>(null);

    const handleBackupMySQL = () => {
        setBackingUp(true);
        startPolling();
        router.post('/admin/backup/mysql', {}, {
            onError: (errors: Record<string, string>) => {
                console.error(errors);
                stopPolling();
                setBackingUp(false);
            },
        });
    };

    const handleBackupDirectory = (path: string) => {
        setBackingUp(true);
        startPolling();
        router.post('/admin/backup/directory', { path }, {
            onError: (errors: Record<string, string>) => {
                console.error(errors);
                stopPolling();
                setBackingUp(false);
            },
        });
    };

    const handleBackupAll = () => {
        setBackingUp(true);
        startPolling();
        router.post('/admin/backup/all', {}, {
            onError: (errors: Record<string, string>) => {
                console.error(errors);
                stopPolling();
                setBackingUp(false);
            },
        });
    };

    const handleRestoreMySQL = (backup: Backup) => {
        setBackingUp(true);
        startPolling();
        router.post(`/admin/backup/restore/${backup.filename}`, {}, {
            onError: (errors: Record<string, string>) => {
                console.error(errors);
                stopPolling();
                setBackingUp(false);
            },
        });
    };

    const handleImportSQL = (file: File) => {
        setImporting(true);
        startPolling();

        const formData = new FormData();
        formData.append('sql_file', file);

        router.post('/admin/backup/import', formData, {
            onError: (errors: Record<string, string>) => {
                console.error(errors);
                stopPolling();
                setImporting(false);
            },
        });
    };

    const downloadBackup = (filename: string) => {
        window.location.href = `/admin/backup/download/${filename}`;
    };

    const deleteBackup = (backup: Backup, onSuccess: () => void) => {
        setDeletingBackupId(backup.id);
        router.delete(`/admin/backup/${backup.filename}`, {
            onFinish: () => {
                setDeletingBackupId(null);
                onSuccess();
            },
        });
    };

    return {
        backingUp,
        setBackingUp,
        importing,
        setImporting,
        deletingBackupId,
        handleBackupMySQL,
        handleBackupDirectory,
        handleBackupAll,
        handleRestoreMySQL,
        handleImportSQL,
        downloadBackup,
        deleteBackup,
    };
}
