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

type Order = {
    id: number;
    order_number: string;
    status: string;
    payment_status: string;
    customer_name: string;
    customer_email: string;
    customer_phone: string | null;
    billing_address: Record<string, string | null>;
    shipping_address: Record<string, string | null>;
    shipping_method: string | null;
    shipping_provider: string | null;
    shipping_price: string;
    payment_method: string;
    tracking_number: string | null;
    customer_notes: string | null;
    internal_notes: string | null;
    subtotal: string;
    discount_total: string;
    total: string;
    items: { id: number; product_name: string; sku: string; quantity: number; unit_price: string; total: string; part_numbers_snapshot: { type: string; number: string }[] | null }[];
    payments: { id: number; method: string; status: string; amount: string; transaction_id: string | null }[];
};

export default function AdminOrderShow({ order }: { order: Order }) {
    const { data, setData, put, processing, errors } = useForm({
        status: order.status,
        payment_status: order.payment_status,
        tracking_number: order.tracking_number ?? '',
        internal_notes: order.internal_notes ?? '',
    });

    function submit(event: FormEvent) {
        event.preventDefault();
        put(`/admin/orders/${order.id}`);
    }

    return (
        <>
            <Head title={order.order_number} />
            <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-7xl gap-5 lg:grid-cols-[1fr_360px]">
                    <section className="grid gap-5">
                        <div className="rounded-lg border border-slate-200 bg-white p-5">
                            <Link href="/admin/orders" className="text-sm font-semibold text-cyan-700">Back to orders</Link>
                            <h1 className="mt-3 text-2xl font-semibold">{order.order_number}</h1>
                            <p className="mt-1 text-sm text-slate-500">{order.customer_name} · {order.customer_email} · {order.customer_phone ?? 'No phone'}</p>
                        </div>
                        <div className="rounded-lg border border-slate-200 bg-white p-5">
                            <h2 className="font-semibold">Items</h2>
                            <div className="mt-3 grid gap-3">
                                {order.items.map((item) => (
                                    <div key={item.id} className="rounded-md border border-slate-200 p-3 text-sm">
                                        <div className="flex justify-between gap-4"><div><p className="font-medium">{item.product_name}</p><p className="text-slate-500">SKU {item.sku} x {item.quantity}</p></div><p className="font-semibold">{item.total}</p></div>
                                        {item.part_numbers_snapshot?.length ? <p className="mt-2 text-xs text-slate-500">{item.part_numbers_snapshot.map((number) => `${number.type}: ${number.number}`).join(' · ')}</p> : null}
                                    </div>
                                ))}
                            </div>
                        </div>
                        <div className="grid gap-5 md:grid-cols-2">
                            <Address title="Billing" address={order.billing_address} />
                            <Address title="Shipping" address={order.shipping_address} />
                        </div>
                    </section>
                    <aside className="grid h-fit gap-5">
                        <form onSubmit={submit} className="rounded-lg border border-slate-200 bg-white p-5">
                            <h2 className="font-semibold">Order management</h2>
                            <div className="mt-4 grid gap-3">
                                <Field label="Status" error={errors.status}><select className="input" value={data.status} onChange={(event) => setData('status', event.target.value)}>{['pending', 'confirmed', 'awaiting_payment', 'paid', 'processing', 'packed', 'shipped', 'delivered', 'cancelled', 'returned', 'refunded'].map((item) => <option key={item} value={item}>{item.replace('_', ' ')}</option>)}</select></Field>
                                <Field label="Payment status" error={errors.payment_status}><select className="input" value={data.payment_status} onChange={(event) => setData('payment_status', event.target.value)}>{['unpaid', 'pending', 'paid', 'failed', 'refunded'].map((item) => <option key={item} value={item}>{item}</option>)}</select></Field>
                                <Field label="Tracking number" error={errors.tracking_number}><input className="input" value={data.tracking_number} onChange={(event) => setData('tracking_number', event.target.value)} /></Field>
                                <Field label="Internal notes" error={errors.internal_notes}><textarea className="input min-h-28" value={data.internal_notes} onChange={(event) => setData('internal_notes', 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">Update order</button>
                        </form>
                        <div className="rounded-lg border border-slate-200 bg-white p-5">
                            <h2 className="font-semibold">Totals</h2>
                            <dl className="mt-3 grid gap-2 text-sm">
                                <Row label="Subtotal" value={order.subtotal} />
                                <Row label="Discount" value={order.discount_total} />
                                <Row label="Shipping" value={order.shipping_price} />
                                <Row label="Total" value={order.total} strong />
                            </dl>
                            <p className="mt-4 text-sm text-slate-500">{order.payment_method} · {order.shipping_method ?? 'No shipping method'}</p>
                        </div>
                    </aside>
                </div>
            </main>
        </>
    );
}

function Address({ title, address }: { title: string; address: Record<string, string | null> }) {
    return <div className="rounded-lg border border-slate-200 bg-white p-5"><h2 className="font-semibold">{title}</h2><p className="mt-3 text-sm leading-6 text-slate-700">{address.name}<br />{address.address_line_1}<br />{address.address_line_2 ? <>{address.address_line_2}<br /></> : null}{address.postal_code} {address.city}<br />{address.country}</p></div>;
}

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>;
}

function Row({ label, value, strong = false }: { label: string; value: string; strong?: boolean }) {
    return <div className={`flex justify-between ${strong ? 'border-t border-slate-100 pt-2 font-semibold' : ''}`}><dt className="text-slate-500">{label}</dt><dd>{value}</dd></div>;
}
