import { Head, Link, useForm } from '@inertiajs/react';

import { AddResourceLink } from '@/components/admin/add-resource-link';
import { Switch } from '@/components/ui/switch';
import { AdminLayout } from '@/layouts/admin-layout';

type Option = {
    id: number;
    name: string;
};

type VehicleEngineData = {
    id: number;
    manufacturer_id: number | null;
    fuel_type_id: number;
    name: string | null;
    slug: string;
    code: string;
    displacement_cc: number | null;
    horsepower: number | null;
    torque_nm: number | null;
    cylinders: number | null;
    production_year_from: number | null;
    production_year_to: number | null;
    notes: string | null;
    is_active: boolean;
    sort_order: number;
};

type VehicleEngineEditProps = {
    engine: VehicleEngineData;
    manufacturerOptions: Option[];
    fuelTypeOptions: Option[];
};

type VehicleEngineForm = {
    manufacturer_id: string;
    fuel_type_id: string;
    name: string;
    slug: string;
    code: string;
    displacement_cc: string;
    horsepower: string;
    torque_nm: string;
    cylinders: string;
    production_year_from: string;
    production_year_to: string;
    notes: string;
    is_active: boolean;
    sort_order: string;
};

export default function VehicleEngineEdit({
    engine,
    manufacturerOptions,
    fuelTypeOptions,
}: VehicleEngineEditProps) {
    const form = useForm<VehicleEngineForm>({
        manufacturer_id: engine.manufacturer_id
            ? String(engine.manufacturer_id)
            : '',
        fuel_type_id: String(engine.fuel_type_id),
        name: engine.name || '',
        slug: engine.slug,
        code: engine.code,
        displacement_cc:
            engine.displacement_cc !== null
                ? String(engine.displacement_cc)
                : '',
        horsepower: engine.horsepower !== null ? String(engine.horsepower) : '',
        torque_nm: engine.torque_nm !== null ? String(engine.torque_nm) : '',
        cylinders: engine.cylinders !== null ? String(engine.cylinders) : '',
        production_year_from:
            engine.production_year_from !== null
                ? String(engine.production_year_from)
                : '',
        production_year_to:
            engine.production_year_to !== null
                ? String(engine.production_year_to)
                : '',
        notes: engine.notes || '',
        is_active: engine.is_active,
        sort_order: String(engine.sort_order),
    });

    const submit = (event: React.FormEvent<HTMLFormElement>) => {
        event.preventDefault();

        form.transform((data) => ({
            ...data,
            manufacturer_id:
                data.manufacturer_id === ''
                    ? null
                    : Number(data.manufacturer_id),
            fuel_type_id:
                data.fuel_type_id === '' ? null : Number(data.fuel_type_id),
            displacement_cc:
                data.displacement_cc === ''
                    ? null
                    : Number(data.displacement_cc),
            horsepower: data.horsepower === '' ? null : Number(data.horsepower),
            torque_nm: data.torque_nm === '' ? null : Number(data.torque_nm),
            cylinders: data.cylinders === '' ? null : Number(data.cylinders),
            production_year_from:
                data.production_year_from === ''
                    ? null
                    : Number(data.production_year_from),
            production_year_to:
                data.production_year_to === ''
                    ? null
                    : Number(data.production_year_to),
            notes: data.notes === '' ? null : data.notes,
            sort_order: data.sort_order === '' ? 0 : Number(data.sort_order),
        }));

        form.put(`/admin/vehicle-engines/${engine.id}`);
    };

    return (
        <AdminLayout>
            <Head title="Edit Vehicle Engine" />
            <div className="space-y-5">
                <div className="flex flex-wrap items-center justify-between gap-3">
                    <h1 className="text-2xl font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                        Edit Vehicle Engine
                    </h1>
                    <Link
                        href="/admin/vehicle-engines"
                        className="text-sm font-medium text-slate-600 hover:text-[#0a1530] dark:text-[#d7c7ff] dark:hover:text-[#efe8ff]"
                    >
                        Back to list
                    </Link>
                </div>

                <form onSubmit={submit} className="space-y-4">
                    <Field
                        label="Manufacturer"
                        error={form.errors.manufacturer_id}
                    >
                        <select
                            value={form.data.manufacturer_id}
                            onChange={(event) =>
                                form.setData(
                                    'manufacturer_id',
                                    event.target.value,
                                )
                            }
                            className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                        >
                            <option value="">Optional</option>
                            {manufacturerOptions.map((option) => (
                                <option key={option.id} value={option.id}>
                                    {option.name}
                                </option>
                            ))}
                        </select>
                        <AddResourceLink href="/admin/manufacturers/create">
                            Missing manufacturer?
                        </AddResourceLink>
                    </Field>
                    <Field label="Fuel Type" error={form.errors.fuel_type_id}>
                        <select
                            value={form.data.fuel_type_id}
                            onChange={(event) =>
                                form.setData('fuel_type_id', event.target.value)
                            }
                            className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            required
                        >
                            <option value="">Select fuel type</option>
                            {fuelTypeOptions.map((option) => (
                                <option key={option.id} value={option.id}>
                                    {option.name}
                                </option>
                            ))}
                        </select>
                        <AddResourceLink href="/admin/fuel-types/create">
                            Missing fuel type?
                        </AddResourceLink>
                    </Field>
                    <Field label="Name" error={form.errors.name}>
                        <input
                            value={form.data.name}
                            onChange={(event) =>
                                form.setData('name', event.target.value)
                            }
                            className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            placeholder="Optional"
                        />
                    </Field>
                    <div className="grid gap-4 md:grid-cols-2">
                        <Field label="Slug" error={form.errors.slug}>
                            <input
                                value={form.data.slug}
                                onChange={(event) =>
                                    form.setData('slug', event.target.value)
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                        <Field label="Code" error={form.errors.code}>
                            <input
                                value={form.data.code}
                                onChange={(event) =>
                                    form.setData('code', event.target.value)
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                    </div>
                    <div className="grid gap-4 md:grid-cols-4">
                        <Field
                            label="Displacement (cc)"
                            error={form.errors.displacement_cc}
                        >
                            <input
                                type="number"
                                min={1}
                                value={form.data.displacement_cc}
                                onChange={(event) =>
                                    form.setData(
                                        'displacement_cc',
                                        event.target.value,
                                    )
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                        <Field
                            label="Power (hp)"
                            error={form.errors.horsepower}
                        >
                            <input
                                type="number"
                                min={1}
                                value={form.data.horsepower}
                                onChange={(event) =>
                                    form.setData(
                                        'horsepower',
                                        event.target.value,
                                    )
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                        <Field
                            label="Torque (Nm)"
                            error={form.errors.torque_nm}
                        >
                            <input
                                type="number"
                                min={1}
                                value={form.data.torque_nm}
                                onChange={(event) =>
                                    form.setData(
                                        'torque_nm',
                                        event.target.value,
                                    )
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                        <Field label="Cylinders" error={form.errors.cylinders}>
                            <input
                                type="number"
                                min={1}
                                value={form.data.cylinders}
                                onChange={(event) =>
                                    form.setData(
                                        'cylinders',
                                        event.target.value,
                                    )
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                    </div>
                    <div className="grid gap-4 md:grid-cols-3">
                        <Field
                            label="Production From"
                            error={form.errors.production_year_from}
                        >
                            <input
                                type="number"
                                min={1886}
                                max={2100}
                                value={form.data.production_year_from}
                                onChange={(event) =>
                                    form.setData(
                                        'production_year_from',
                                        event.target.value,
                                    )
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                        <Field
                            label="Production To"
                            error={form.errors.production_year_to}
                        >
                            <input
                                type="number"
                                min={1886}
                                max={2100}
                                value={form.data.production_year_to}
                                onChange={(event) =>
                                    form.setData(
                                        'production_year_to',
                                        event.target.value,
                                    )
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                        <Field
                            label="Sort Order"
                            error={form.errors.sort_order}
                        >
                            <input
                                type="number"
                                min={0}
                                value={form.data.sort_order}
                                onChange={(event) =>
                                    form.setData(
                                        'sort_order',
                                        event.target.value,
                                    )
                                }
                                className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                            />
                        </Field>
                    </div>
                    <Field label="Notes" error={form.errors.notes}>
                        <textarea
                            value={form.data.notes}
                            onChange={(event) =>
                                form.setData('notes', event.target.value)
                            }
                            className="h-28 w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                        />
                    </Field>
                    <div className="mt-2 rounded-xl border border-slate-200 bg-slate-50/80 p-4 dark:border-[#3c2b68] dark:bg-[#2a1d50]/40">
                        <div className="flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
                            <div className="inline-flex items-center gap-3 text-sm text-slate-700 dark:text-[#d7c7ff]">
                                <Switch
                                    checked={form.data.is_active}
                                    onChange={(checked) =>
                                        form.setData('is_active', checked)
                                    }
                                    ariaLabel="Active engine"
                                />
                                Active engine
                            </div>
                            <button
                                type="submit"
                                disabled={form.processing}
                                className="w-full rounded-lg bg-[#0b7285] px-4 py-2 text-sm font-semibold text-white hover:bg-[#095f6f] disabled:opacity-50 md:w-auto dark:bg-[#7c3aed] dark:hover:bg-[#8b5cf6]"
                            >
                                {form.processing
                                    ? 'Saving...'
                                    : 'Update Engine'}
                            </button>
                        </div>
                    </div>
                </form>
            </div>
        </AdminLayout>
    );
}

function Field({
    label,
    error,
    children,
}: {
    label: string;
    error?: string;
    children: React.ReactNode;
}) {
    return (
        <div>
            <label className="block text-sm font-medium text-[#0a1530] dark:text-[#e5dcff]">
                {label}
            </label>
            <div className="mt-1">{children}</div>
            {error ? (
                <p className="mt-1 text-xs text-rose-600">{error}</p>
            ) : null}
        </div>
    );
}
