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

type Vehicle = { id: number; make: string; model: string; year: number | null; engine: string | null; engine_code: string | null; transmission: string | null; vin: string | null };

export default function CustomerVehicles({ vehicles }: { vehicles: Vehicle[] }) {
    const { data, setData, transform, post, processing, errors } = useForm({ make: '', model: '', year: '', engine: '', engine_code: '', transmission: '', vin: '' });
    function submit(event: FormEvent) {
        event.preventDefault();
        transform((values) => ({ ...values, year: values.year || null }));
        post('/account/vehicles', { preserveScroll: true });
    }
    return (
        <>
            <Head title="Saved Vehicles" />
            <main className="min-h-screen bg-slate-50 px-4 py-6 text-slate-900 sm:px-6 lg:px-8">
                <div className="mx-auto grid max-w-6xl gap-5 lg:grid-cols-[380px_1fr]">
                    <form onSubmit={submit} className="h-fit rounded-lg border border-slate-200 bg-white p-5">
                        <Link href="/account" className="text-sm font-semibold text-cyan-700">Account</Link>
                        <h1 className="mt-3 text-2xl font-semibold">Saved vehicles</h1>
                        <div className="mt-5 grid gap-3">
                            <Field label="Make" error={errors.make}><input className="input" value={data.make} onChange={(event) => setData('make', event.target.value)} /></Field>
                            <Field label="Model" error={errors.model}><input className="input" value={data.model} onChange={(event) => setData('model', event.target.value)} /></Field>
                            <Field label="Year" error={errors.year}><input className="input" type="number" min="1900" max="2100" value={data.year} onChange={(event) => setData('year', event.target.value)} /></Field>
                            <Field label="Engine" error={errors.engine}><input className="input" value={data.engine} onChange={(event) => setData('engine', event.target.value)} /></Field>
                            <Field label="Engine code" error={errors.engine_code}><input className="input" value={data.engine_code} onChange={(event) => setData('engine_code', event.target.value)} /></Field>
                            <Field label="Transmission" error={errors.transmission}><input className="input" value={data.transmission} onChange={(event) => setData('transmission', event.target.value)} /></Field>
                            <Field label="VIN" error={errors.vin}><input className="input" value={data.vin} onChange={(event) => setData('vin', event.target.value)} /></Field>
                        </div>
                        <button disabled={processing} className="mt-4 w-full rounded-md bg-cyan-700 px-4 py-2 text-sm font-semibold text-white disabled:opacity-60">Save vehicle</button>
                    </form>
                    <section className="grid gap-3">
                        <Link href="/account/recommendations" className="rounded-lg border border-cyan-200 bg-cyan-50 p-4 text-sm font-semibold text-cyan-800">View compatible parts for saved vehicles</Link>
                        {vehicles.map((vehicle) => (
                            <article key={vehicle.id} className="rounded-lg border border-slate-200 bg-white p-4">
                                <div className="flex justify-between gap-3">
                                    <div><h2 className="font-semibold">{vehicle.make} {vehicle.model}</h2><p className="text-sm text-slate-500">{vehicle.year ?? 'Any year'} · {vehicle.engine_code ?? vehicle.engine ?? 'Any engine'} · {vehicle.transmission ?? 'Any transmission'}</p></div>
                                    <button onClick={() => router.delete(`/account/vehicles/${vehicle.id}`, { preserveScroll: true })} className="text-sm font-semibold text-red-700">Delete</button>
                                </div>
                            </article>
                        ))}
                    </section>
                </div>
            </main>
        </>
    );
}

function Field({ label, error, children }: { label: string; error?: string; children: React.ReactNode }) {
    return <label className="grid gap-1 text-sm font-medium text-slate-700"><span>{label}</span>{children}{error ? <span className="text-xs text-red-600">{error}</span> : null}</label>;
}
