import { Head, useForm } from '@inertiajs/react';
import 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 { Checkbox } from '@/components/ui/checkbox';
import { useCan } from '@/hooks/use-can';
import { edit as editNumbering } from '@/routes/admin/settings/company/numbering';
import type {
    CompanySettingData,
    NumberingFormatData,
} from '@/types/company-setting';

type NumberingFormData = Record<
    string,
    Pick<NumberingFormatData, 'prefix' | 'yearly' | 'padding'>
>;

function buildNumberingFormData(
    formats: Record<string, NumberingFormatData>,
): NumberingFormData {
    return Object.fromEntries(
        Object.entries(formats).map(([key, format]) => [
            key,
            {
                prefix: format.prefix,
                yearly: format.yearly,
                padding: format.padding,
            },
        ]),
    );
}

export default function CompanyNumberingSettings({
    company,
}: {
    company: CompanySettingData;
}) {
    const canUpdate = useCan('settings.update');

    const form = useForm<{ numbering: NumberingFormData }>({
        numbering: buildNumberingFormData(company.numbering_formats),
    });

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

        form.put(CompanySettingController.updateNumbering.url(), {
            preserveScroll: true,
        });
    }

    function updateFormat(
        key: string,
        field: keyof NumberingFormData[string],
        value: string | number | boolean,
    ) {
        form.setData('numbering', {
            ...form.data.numbering,
            [key]: {
                ...form.data.numbering[key],
                [field]: value,
            },
        });
    }

    return (
        <>
            <Head title="Formats de numérotation" />

            <h1 className="sr-only">Formats de numérotation</h1>

            <div className="space-y-6">
                <Heading
                    variant="small"
                    title="Numérotation"
                    description="Préfixes et formats des documents principaux"
                />

                <form onSubmit={submit} className="space-y-8">
                    {Object.entries(company.numbering_formats).map(
                        ([key, format]) => (
                            <div
                                key={key}
                                className="space-y-4 rounded-lg border p-4"
                            >
                                <div>
                                    <h3 className="font-medium">
                                        {format.label}
                                    </h3>
                                    <p className="text-sm text-muted-foreground">
                                        Exemple : {format.example}
                                    </p>
                                </div>

                                <div className="grid gap-2">
                                    <Label htmlFor={`${key}-prefix`}>
                                        Préfixe
                                    </Label>
                                    <Input
                                        id={`${key}-prefix`}
                                        value={
                                            form.data.numbering[key]?.prefix ??
                                            ''
                                        }
                                        onChange={(event) =>
                                            updateFormat(
                                                key,
                                                'prefix',
                                                event.target.value.toUpperCase(),
                                            )
                                        }
                                        disabled={!canUpdate || form.processing}
                                        maxLength={10}
                                        placeholder="FAC"
                                    />
                                    <InputError
                                        message={
                                            form.errors[
                                                `numbering.${key}.prefix`
                                            ]
                                        }
                                    />
                                </div>

                                <div className="grid gap-2">
                                    <Label htmlFor={`${key}-padding`}>
                                        Longueur du numéro
                                    </Label>
                                    <Input
                                        id={`${key}-padding`}
                                        type="number"
                                        min={3}
                                        max={6}
                                        value={
                                            form.data.numbering[key]?.padding ??
                                            3
                                        }
                                        onChange={(event) =>
                                            updateFormat(
                                                key,
                                                'padding',
                                                Number(event.target.value),
                                            )
                                        }
                                        disabled={!canUpdate || form.processing}
                                        className="max-w-xs"
                                    />
                                    <InputError
                                        message={
                                            form.errors[
                                                `numbering.${key}.padding`
                                            ]
                                        }
                                    />
                                </div>

                                <div className="flex items-center justify-between gap-4">
                                    <div className="space-y-1">
                                        <Label htmlFor={`${key}-yearly`}>
                                            Remise à zéro chaque année
                                        </Label>
                                        <p className="text-sm text-muted-foreground">
                                            Format annuel (ex. FAC-2026-0001)
                                        </p>
                                    </div>
                                    <Checkbox
                                        id={`${key}-yearly`}
                                        checked={
                                            form.data.numbering[key]?.yearly ??
                                            false
                                        }
                                        onCheckedChange={(checked) =>
                                            updateFormat(
                                                key,
                                                'yearly',
                                                checked === true,
                                            )
                                        }
                                        disabled={!canUpdate || form.processing}
                                    />
                                </div>
                                <InputError
                                    message={
                                        form.errors[`numbering.${key}.yearly`]
                                    }
                                />
                            </div>
                        ),
                    )}

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

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