import { Button } from '@/components/ui/button';
import {
    Card,
    CardAction,
    CardContent,
    CardDescription,
    CardFooter,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { useAuthBreadcrumb } from '@/hooks/use-auth-breadcrumb';
import AppLayout from '@/layouts/app-layout';
import { Head, router } from '@inertiajs/react';
import { ChangeEvent, useState } from 'react';
import { toast, Toaster } from 'sonner';

export default function ImportData() {
    const breadcrumbs = useAuthBreadcrumb();

    // 🔹 State untuk tiap file
    const [files, setFiles] = useState<{
        program: File | null;
        kegiatan: File | null;
        subkegiatan: File | null;
        rekening: File | null;
        subrekening: File | null;
        satuan: File | null;
        sakip: File | null;
        pegawai: File | null;
    }>({
        program: null,
        kegiatan: null,
        subkegiatan: null,
        rekening: null,
        subrekening: null,
        satuan: null,
        sakip: null,
        pegawai: null,
    });

    // 🔹 State loading per tombol
    const [loading, setLoading] = useState<{
        program: boolean;
        kegiatan: boolean;
        subkegiatan: boolean;
        rekening: boolean;
        subrekening: boolean;
        satuan: boolean;
        sakip: boolean;
        pegawai: boolean;
    }>({
        program: false,
        kegiatan: false,
        subkegiatan: false,
        rekening: false,
        subrekening: false,
        satuan: false,
        sakip: false,
        pegawai: false,
    });

    const [fileInputKey, setFileInputKey] = useState(Date.now());

    const handleFileChange = (
        e: ChangeEvent<HTMLInputElement>,
        type:
            | 'program'
            | 'kegiatan'
            | 'subkegiatan'
            | 'rekening'
            | 'subrekening'
            | 'satuan'
            | 'sakip'
            | 'pegawai',
    ) => {
        if (e.target.files && e.target.files.length > 0) {
            setFiles((prev) => ({ ...prev, [type]: e.target.files![0] }));
        }
    };

    const handleUpload = (
        type:
            | 'program'
            | 'kegiatan'
            | 'subkegiatan'
            | 'rekening'
            | 'subrekening'
            | 'satuan'
            | 'sakip'
            | 'pegawai',
    ) => {
        if (!files[type]) {
            return toast.error(`Silakan pilih file ${type} terlebih dahulu`, {
                id: 'jika-error',
                style: { background: '#FF4D4F', color: '#fff' },
            });
        }

        setLoading((prev) => ({ ...prev, [type]: true }));

        router.post(
            route(`import.${type}`),
            { file: files[type] },
            {
                forceFormData: true,
                onSuccess: () => {
                    toast.success(`Data ${type} berhasil diimport!`, {
                        id: 'jika-success',
                        style: { background: '#52C41A', color: '#fff' },
                    });
                    setFiles((prev) => ({ ...prev, [type]: null }));
                    setFileInputKey(Date.now());
                },
                onError: (errors) => {
                    console.error(errors);
                    return toast.error(`Gagal import data ${type}`, {
                        id: 'jika-error',
                        style: { background: '#FF4D4F', color: '#fff' },
                    });
                },
                onFinish: () => {
                    setLoading((prev) => ({ ...prev, [type]: false }));
                },
            },
        );
    };

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Import Data" />
            <div className="flex h-full flex-1 flex-col gap-3 rounded-xl px-6 py-4">
                <div className="flex flex-col gap-2">
                    <span>
                        <h1 className="text-2xl font-bold uppercase">
                            Import Data
                        </h1>
                        <p className="text-sm text-muted-foreground">
                            Halaman ini digunakan untuk mengelola data yang akan
                            diimport
                        </p>
                    </span>
                </div>

                <div className="mt-4 grid auto-rows-min gap-3 md:grid-cols-3">
                    {/* Import Program */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>Program</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="program">File</Label>
                                <Input
                                    id="program"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'program')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.program}
                                onClick={() => handleUpload('program')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.program ? 'Uploading...' : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>

                    {/* Import Kegiatan */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>Kegiatan</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="kegiatan">File</Label>
                                <Input
                                    id="kegiatan"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'kegiatan')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.kegiatan}
                                onClick={() => handleUpload('kegiatan')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.kegiatan ? 'Uploading...' : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>

                    {/* Import Sub Kegiatan */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>Sub Kegiatan</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="subkegiatan">File</Label>
                                <Input
                                    id="subkegiatan"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'subkegiatan')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.subkegiatan}
                                onClick={() => handleUpload('subkegiatan')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.subkegiatan
                                    ? 'Uploading...'
                                    : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>

                    {/* Import Sub Kegiatan */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>Rekening</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="rekening">File</Label>
                                <Input
                                    id="rekening"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'rekening')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.rekening}
                                onClick={() => handleUpload('rekening')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.rekening ? 'Uploading...' : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>

                    {/* Import Sub Kegiatan */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>Sub Rekening</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="subrekening">File</Label>
                                <Input
                                    id="subrekening"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'subrekening')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.subrekening}
                                onClick={() => handleUpload('subrekening')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.subrekening
                                    ? 'Uploading...'
                                    : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>

                    {/* Import Satuan */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>Satuan</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="satuan">File</Label>
                                <Input
                                    id="satuan"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'satuan')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.satuan}
                                onClick={() => handleUpload('satuan')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.satuan ? 'Uploading...' : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>

                    {/* Import Sakip */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>Sakip</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="sakip">File</Label>
                                <Input
                                    id="sakip"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'sakip')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.sakip}
                                onClick={() => handleUpload('sakip')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.sakip ? 'Uploading...' : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>

                    {/* Import pegawai */}
                    <Card className="w-full max-w-sm">
                        <CardHeader>
                            <CardTitle>pegawai</CardTitle>
                            <CardDescription>
                                Pilih file dengan tipe xlsx
                            </CardDescription>
                            <CardAction></CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid gap-2">
                                <Label htmlFor="pegawai">File</Label>
                                <Input
                                    id="pegawai"
                                    type="file"
                                    key={fileInputKey}
                                    onChange={(e) =>
                                        handleFileChange(e, 'pegawai')
                                    }
                                />
                            </div>
                        </CardContent>
                        <CardFooter className="flex-col gap-2">
                            <Button
                                disabled={loading.pegawai}
                                onClick={() => handleUpload('pegawai')}
                                className="w-full bg-emerald-600 text-white"
                            >
                                {loading.pegawai ? 'Uploading...' : 'Upload'}
                            </Button>
                        </CardFooter>
                    </Card>
                </div>
            </div>
            <Toaster position="top-right" richColors closeButton />
        </AppLayout>
    );
}
