import { Head, useForm } from '@inertiajs/react';
import { useEffect, useRef, useState, type FormEvent } from 'react';
import CompanySettingController from '@/actions/App/Http/Controllers/Admin/CompanySettingController';
import Heading from '@/components/heading';
import InputError from '@/components/input-error';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { useCan } from '@/hooks/use-can';
import { edit } from '@/routes/admin/settings/company';
import type { CompanySettingData } from '@/types/company-setting';

export default function CompanyIdentitySettings({
    company,
}: {
    company: CompanySettingData;
}) {
    const canUpdate = useCan('settings.update');
    const logoInputRef = useRef<HTMLInputElement>(null);
    const [logoPreview, setLogoPreview] = useState<string | null>(
        company.logo_url,
    );

    const form = useForm({
        name: company.name,
        legal_name: company.legal_name,
        address: company.address ?? '',
        city: company.city ?? '',
        country: company.country,
        logo: null as File | null,
        remove_logo: false,
    });

    useEffect(() => {
        setLogoPreview(company.logo_url);
    }, [company.logo_url]);

    useEffect(() => {
        return () => {
            if (logoPreview && logoPreview.startsWith('blob:')) {
                URL.revokeObjectURL(logoPreview);
            }
        };
    }, [logoPreview]);

    function submit(event: FormEvent) {
        event.preventDefault();

        form.transform((data) => ({
            ...data,
            _method: 'put',
        }));

        form.post(CompanySettingController.updateIdentity.url(), {
            forceFormData: true,
            preserveScroll: true,
            onSuccess: () => {
                form.setData('logo', null);
                form.setData('remove_logo', false);
                if (logoInputRef.current) {
                    logoInputRef.current.value = '';
                }
            },
        });
    }

    function handleLogoChange(event: React.ChangeEvent<HTMLInputElement>) {
        const file = event.target.files?.[0] ?? null;
        form.setData('logo', file);
        form.setData('remove_logo', false);

        if (file) {
            setLogoPreview(URL.createObjectURL(file));
        }
    }

    function removeLogo() {
        form.setData('logo', null);
        form.setData('remove_logo', true);
        setLogoPreview(null);
    }

    return (
        <>
            <Head title="Identité de l'entreprise" />

            <h1 className="sr-only">Identité de l'entreprise</h1>

            <div className="space-y-6">
                <Heading
                    variant="small"
                    title="Identité"
                    description="Nom, logo et localisation figurant sur les documents imprimés"
                />

                <form onSubmit={submit} className="space-y-6">
                    <div className="grid gap-2">
                        <Label htmlFor="logo">Logo</Label>
                        <div className="flex items-center gap-4">
                            {logoPreview ? (
                                <img
                                    src={logoPreview}
                                    alt="Logo entreprise"
                                    className="h-16 w-auto max-w-[160px] rounded border object-contain p-1"
                                />
                            ) : (
                                <div className="flex h-16 w-28 items-center justify-center rounded border border-dashed text-xs text-muted-foreground">
                                    Aucun logo
                                </div>
                            )}
                            {canUpdate && (
                                <div className="flex flex-col gap-2">
                                    <Input
                                        ref={logoInputRef}
                                        id="logo"
                                        type="file"
                                        accept="image/*"
                                        onChange={handleLogoChange}
                                        disabled={form.processing}
                                    />
                                    {logoPreview && (
                                        <Button
                                            type="button"
                                            variant="outline"
                                            size="sm"
                                            onClick={removeLogo}
                                            disabled={form.processing}
                                        >
                                            Supprimer le logo
                                        </Button>
                                    )}
                                </div>
                            )}
                        </div>
                        <InputError message={form.errors.logo} />
                    </div>

                    <div className="grid gap-2">
                        <Label htmlFor="name">Nom commercial</Label>
                        <Input
                            id="name"
                            value={form.data.name}
                            onChange={(event) =>
                                form.setData('name', event.target.value)
                            }
                            required
                            disabled={!canUpdate || form.processing}
                            placeholder="Nom commercial"
                        />
                        <InputError message={form.errors.name} />
                    </div>

                    <div className="grid gap-2">
                        <Label htmlFor="legal_name">Raison sociale</Label>
                        <Input
                            id="legal_name"
                            value={form.data.legal_name}
                            onChange={(event) =>
                                form.setData('legal_name', event.target.value)
                            }
                            required
                            disabled={!canUpdate || form.processing}
                            placeholder="Raison sociale"
                        />
                        <InputError message={form.errors.legal_name} />
                    </div>

                    <div className="grid gap-2">
                        <Label htmlFor="address">Adresse</Label>
                        <Input
                            id="address"
                            value={form.data.address}
                            onChange={(event) =>
                                form.setData('address', event.target.value)
                            }
                            disabled={!canUpdate || form.processing}
                            placeholder="Adresse"
                        />
                        <InputError message={form.errors.address} />
                    </div>

                    <div className="grid gap-2">
                        <Label htmlFor="city">Ville</Label>
                        <Input
                            id="city"
                            value={form.data.city}
                            onChange={(event) =>
                                form.setData('city', event.target.value)
                            }
                            disabled={!canUpdate || form.processing}
                            placeholder="Ville"
                        />
                        <InputError message={form.errors.city} />
                    </div>

                    <div className="grid gap-2">
                        <Label htmlFor="country">Pays</Label>
                        <Input
                            id="country"
                            value={form.data.country}
                            onChange={(event) =>
                                form.setData('country', event.target.value)
                            }
                            disabled={!canUpdate || form.processing}
                            placeholder="Pays"
                        />
                        <InputError message={form.errors.country} />
                    </div>

                    {canUpdate && (
                        <div className="flex items-center gap-4">
                            <Button disabled={form.processing}>
                                Enregistrer
                            </Button>
                        </div>
                    )}
                </form>
            </div>
        </>
    );
}

CompanyIdentitySettings.layout = {
    breadcrumbs: [
        {
            title: 'Paramètres de l\'entreprise',
            href: edit(),
        },
    ],
};
