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

import { PublicLayout } from '@/layouts/public-layout';
import { formatMoney } from '@/lib/money';
import type { AppPageProps } from '@/types';

type CheckoutItem = {
    product_id: number;
    name: string;
    slug: string;
    sku: string | null;
    quantity: number;
    media_url: string | null;
    unit_price_minor: number;
    line_total_minor: number;
};

type CheckoutSummary = {
    item_count: number;
    unique_count: number;
    subtotal_minor: number;
    total_minor: number;
};

type CheckoutDefaults = {
    customer_name: string;
    customer_email: string;
    customer_phone: string;
    address_line1: string;
    address_line2: string;
    city: string;
    postal_code: string;
    country: string;
    notes: string;
};

type CheckoutProps = {
    items: CheckoutItem[];
    summary: CheckoutSummary;
    defaults: CheckoutDefaults;
};

type CheckoutForm = CheckoutDefaults;

export default function CheckoutIndex({
    items,
    summary,
    defaults,
}: CheckoutProps) {
    const { config } = usePage<AppPageProps>().props;
    const form = useForm<CheckoutForm>({
        customer_name: defaults.customer_name,
        customer_email: defaults.customer_email,
        customer_phone: defaults.customer_phone,
        address_line1: defaults.address_line1,
        address_line2: defaults.address_line2,
        city: defaults.city,
        postal_code: defaults.postal_code,
        country: defaults.country,
        notes: defaults.notes,
    });

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

        form.post('/checkout');
    };

    return (
        <PublicLayout title="Checkout">
            <Head title="Checkout" />

            <div className="space-y-6">
                <div className="flex flex-wrap items-center justify-between gap-3">
                    <h1 className="text-2xl font-semibold text-main">
                        Checkout
                    </h1>
                    <Link
                        href="/cart"
                        className="rounded-lg border border-border px-3 py-1.5 text-sm font-medium text-muted hover:bg-surface hover:text-main"
                    >
                        Back to Cart
                    </Link>
                </div>

                <section className="grid gap-6 lg:grid-cols-[1fr_360px]">
                    <form
                        onSubmit={submit}
                        className="space-y-4 rounded-2xl border border-border bg-card p-4 shadow-sm"
                    >
                        <h2 className="text-base font-semibold text-main">
                            Shipping Details
                        </h2>

                        <Field
                            label="Full Name"
                            value={form.data.customer_name}
                            onChange={(value) =>
                                form.setData('customer_name', value)
                            }
                            error={form.errors.customer_name}
                        />
                        <div className="grid gap-4 md:grid-cols-2">
                            <Field
                                label="Email"
                                type="email"
                                value={form.data.customer_email}
                                onChange={(value) =>
                                    form.setData('customer_email', value)
                                }
                                error={form.errors.customer_email}
                            />
                            <Field
                                label="Phone"
                                value={form.data.customer_phone}
                                onChange={(value) =>
                                    form.setData('customer_phone', value)
                                }
                                error={form.errors.customer_phone}
                                required={false}
                            />
                        </div>
                        <Field
                            label="Address Line 1"
                            value={form.data.address_line1}
                            onChange={(value) =>
                                form.setData('address_line1', value)
                            }
                            error={form.errors.address_line1}
                        />
                        <Field
                            label="Address Line 2"
                            value={form.data.address_line2}
                            onChange={(value) =>
                                form.setData('address_line2', value)
                            }
                            error={form.errors.address_line2}
                            required={false}
                        />
                        <div className="grid gap-4 md:grid-cols-3">
                            <Field
                                label="City"
                                value={form.data.city}
                                onChange={(value) =>
                                    form.setData('city', value)
                                }
                                error={form.errors.city}
                            />
                            <Field
                                label="Postal Code"
                                value={form.data.postal_code}
                                onChange={(value) =>
                                    form.setData('postal_code', value)
                                }
                                error={form.errors.postal_code}
                            />
                            <Field
                                label="Country"
                                value={form.data.country}
                                onChange={(value) =>
                                    form.setData('country', value)
                                }
                                error={form.errors.country}
                            />
                        </div>
                        <div>
                            <label className="block text-sm font-medium text-main">
                                Notes
                            </label>
                            <textarea
                                value={form.data.notes}
                                onChange={(event) =>
                                    form.setData('notes', event.target.value)
                                }
                                className="mt-1 h-24 w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-main outline-none focus:border-primary"
                            />
                            {form.errors.notes ? (
                                <p className="mt-1 text-xs text-danger">
                                    {form.errors.notes}
                                </p>
                            ) : null}
                        </div>

                        <button
                            type="submit"
                            disabled={form.processing}
                            className="w-full rounded-lg bg-primary px-4 py-2 text-sm font-semibold text-white hover:bg-primary-hover disabled:opacity-50"
                        >
                            {form.processing
                                ? 'Placing Order...'
                                : 'Place Order'}
                        </button>
                    </form>

                    <aside className="h-fit rounded-2xl border border-border bg-card p-4 shadow-sm">
                        <h2 className="text-base font-semibold text-main">
                            Order Items
                        </h2>
                        <ul className="mt-3 space-y-3">
                            {items.map((item) => (
                                <li
                                    key={item.product_id}
                                    className="rounded-xl border border-border p-3"
                                >
                                    <p className="text-sm font-medium text-main">
                                        {item.name}
                                    </p>
                                    <p className="text-xs text-muted">
                                        Qty: {item.quantity}
                                        {item.sku ? ` | SKU: ${item.sku}` : ''}
                                    </p>
                                    <p className="text-xs text-muted">
                                        Unit:{' '}
                                        {formatMoney(
                                            item.unit_price_minor,
                                            config.default_currency,
                                        )}
                                    </p>
                                    <p className="text-sm font-semibold text-main">
                                        Line total:{' '}
                                        {formatMoney(
                                            item.line_total_minor,
                                            config.default_currency,
                                        )}
                                    </p>
                                </li>
                            ))}
                        </ul>
                        <div className="mt-4 space-y-1 text-sm text-main">
                            <p>Items: {summary.item_count}</p>
                            <p>
                                Subtotal:{' '}
                                {formatMoney(
                                    summary.subtotal_minor,
                                    config.default_currency,
                                )}
                            </p>
                            <p className="font-semibold">
                                Total:{' '}
                                {formatMoney(
                                    summary.total_minor,
                                    config.default_currency,
                                )}
                            </p>
                        </div>
                    </aside>
                </section>
            </div>
        </PublicLayout>
    );
}

type FieldProps = {
    label: string;
    value: string;
    onChange: (value: string) => void;
    error?: string;
    type?: string;
    required?: boolean;
};

function Field({
    label,
    value,
    onChange,
    error,
    type = 'text',
    required = true,
}: FieldProps) {
    const id = label.toLowerCase().replace(/\s+/g, '-');

    return (
        <div>
            <label htmlFor={id} className="block text-sm font-medium text-main">
                {label}
            </label>
            <input
                id={id}
                type={type}
                value={value}
                onChange={(event) => onChange(event.target.value)}
                required={required}
                className="mt-1 w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-main outline-none focus:border-primary"
            />
            {error ? <p className="mt-1 text-xs text-danger">{error}</p> : null}
        </div>
    );
}
