import { Head, router, useForm, usePage } from '@inertiajs/react';
import { useRef, useState } from 'react';
import SignatureController from '@/actions/App/Http/Controllers/Settings/SignatureController';
import { ConfirmDialog } from '@/components/confirm-dialog';
import Heading from '@/components/heading';
import InputError from '@/components/input-error';
import {
    SignaturePad,
    type SignaturePadHandle,
} from '@/components/signature-pad';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import {
    ToggleGroup,
    ToggleGroupItem,
} from '@/components/ui/toggle-group';

type PageProps = {
    signatureUrl: string | null;
};

export default function SignatureSettings() {
    const { signatureUrl } = usePage<PageProps>().props;
    const [mode, setMode] = useState<'draw' | 'upload'>('draw');
    const [uploadPreview, setUploadPreview] = useState<string | null>(null);
    const signaturePadRef = useRef<SignaturePadHandle>(null);

    const form = useForm<{ signature: File | null }>({
        signature: null,
    });

    async function handleSave() {
        const file =
            mode === 'draw'
                ? await signaturePadRef.current?.toFile()
                : form.data.signature;

        if (!file) {
            return;
        }

        form.transform(() => ({ signature: file }));
        form.post(SignatureController.update.url(), {
            forceFormData: true,
            preserveScroll: true,
            onSuccess: () => {
                setUploadPreview(null);
                signaturePadRef.current?.clear();
            },
        });
    }

    return (
        <>
            <Head title="Signature" />

            <div className="space-y-6">
                <Heading
                    variant="small"
                    title="Signature électronique"
                    description="Dessinez ou importez votre signature, utilisée pour valider vos documents (factures, notes de frais, bons de commande)"
                />

                <div className="grid gap-2">
                    <p className="text-sm font-medium">Signature actuelle</p>
                    {signatureUrl ? (
                        <div className="inline-block rounded-md border border-dashed bg-white p-2">
                            <img
                                src={signatureUrl}
                                alt="Votre signature"
                                className="h-16"
                            />
                        </div>
                    ) : (
                        <p className="text-muted-foreground text-sm">
                            Aucune signature enregistrée.
                        </p>
                    )}
                    {signatureUrl && (
                        <ConfirmDialog
                            trigger={
                                <Button variant="outline" size="sm">
                                    Supprimer la signature
                                </Button>
                            }
                            title="Supprimer votre signature ?"
                            description="Elle ne sera plus apposée sur les documents que vous validerez."
                            onConfirm={() =>
                                router.delete(
                                    SignatureController.destroy.url(),
                                    { preserveScroll: true },
                                )
                            }
                        />
                    )}
                </div>

                <ToggleGroup
                    type="single"
                    variant="outline"
                    value={mode}
                    onValueChange={(value) => {
                        if (value === 'draw' || value === 'upload') {
                            setMode(value);
                        }
                    }}
                >
                    <ToggleGroupItem value="draw">Dessiner</ToggleGroupItem>
                    <ToggleGroupItem value="upload">Importer</ToggleGroupItem>
                </ToggleGroup>

                {mode === 'draw' ? (
                    <SignaturePad ref={signaturePadRef} />
                ) : (
                    <div className="grid gap-2">
                        <Input
                            type="file"
                            accept="image/png,image/jpeg"
                            className="max-w-xs"
                            onChange={(e) => {
                                const file = e.target.files?.[0] ?? null;
                                form.setData('signature', file);
                                setUploadPreview(
                                    file ? URL.createObjectURL(file) : null,
                                );
                            }}
                        />
                        {uploadPreview && (
                            <div className="inline-block rounded-md border border-dashed bg-white p-2">
                                <img
                                    src={uploadPreview}
                                    alt="Aperçu de la signature"
                                    className="h-16"
                                />
                            </div>
                        )}
                    </div>
                )}

                <InputError message={form.errors.signature} />

                <div className="flex items-center gap-4">
                    <Button
                        type="button"
                        disabled={form.processing}
                        onClick={handleSave}
                    >
                        Enregistrer
                    </Button>
                </div>
            </div>
        </>
    );
}
