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

type Address = { id: number; type: string; name: string; phone: string | null; country: string; city: string; postal_code: string | null; address_line_1: string; address_line_2: string | null; is_default: boolean };

export default function CustomerAddresses({ addresses }: { addresses: Address[] }) {
    const { data, setData, post, processing, errors } = useForm({
        type: 'shipping',
        name: '',
        phone: '',
        country: 'Bulgaria',
        city: '',
        postal_code: '',
        address_line_1: '',
        address_line_2: '',
        is_default: false,
    });
    function submit(event: FormEvent) {
        event.preventDefault();
        post('/account/addresses', { preserveScroll: true });
    }
    return (
        <>
            <Head title="Addresses" />
            <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">Addresses</h1>
                        <div className="mt-5 grid gap-3">
                            <Field label="Type" error={errors.type}><select className="input" value={data.type} onChange={(event) => setData('type', event.target.value)}><option value="shipping">Shipping</option><option value="billing">Billing</option></select></Field>
                            <Field label="Name" error={errors.name}><input className="input" value={data.name} onChange={(event) => setData('name', event.target.value)} /></Field>
                            <Field label="Phone" error={errors.phone}><input className="input" value={data.phone} onChange={(event) => setData('phone', event.target.value)} /></Field>
                            <Field label="Country" error={errors.country}><input className="input" value={data.country} onChange={(event) => setData('country', event.target.value)} /></Field>
                            <Field label="City" error={errors.city}><input className="input" value={data.city} onChange={(event) => setData('city', event.target.value)} /></Field>
                            <Field label="Postal code" error={errors.postal_code}><input className="input" value={data.postal_code} onChange={(event) => setData('postal_code', event.target.value)} /></Field>
                            <Field label="Address" error={errors.address_line_1}><input className="input" value={data.address_line_1} onChange={(event) => setData('address_line_1', event.target.value)} /></Field>
                            <label className="flex items-center gap-2 text-sm font-medium"><input type="checkbox" checked={data.is_default} onChange={(event) => setData('is_default', event.target.checked)} /> Default for this type</label>
                        </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 address</button>
                    </form>
                    <section className="grid gap-3">
                        {addresses.map((address) => (
                            <article key={address.id} className="rounded-lg border border-slate-200 bg-white p-4">
                                <div className="flex justify-between gap-3">
                                    <div><h2 className="font-semibold">{address.name}</h2><p className="text-sm text-slate-500 capitalize">{address.type}{address.is_default ? ' · default' : ''}</p></div>
                                    <button onClick={() => router.delete(`/account/addresses/${address.id}`, { preserveScroll: true })} className="text-sm font-semibold text-red-700">Delete</button>
                                </div>
                                <p className="mt-3 text-sm leading-6 text-slate-700">{address.address_line_1}<br />{address.postal_code} {address.city}<br />{address.country}</p>
                            </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>;
}
