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

type CartItem = {
    id: number;
    quantity: number;
    product: {
        name: string;
        slug: string;
        sku: string;
        price: string;
        discount_price: string | null;
        stock_quantity: number;
        reserved_quantity: number;
        images: { path: string; alt_text: string | null; is_main: boolean }[];
    };
};

export default function CartIndex({
    cart,
    totals,
}: {
    cart: { items: CartItem[] };
    totals: { subtotal: number; discount_total: number; total: number };
}) {
    const { data, setData, post, processing, errors } = useForm({ discount_code: '' });

    function updateQuantity(item: CartItem, quantity: number) {
        router.patch(`/cart/items/${item.id}`, { quantity }, { preserveScroll: true });
    }

    return (
        <>
            <Head title="Cart" />
            <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 max-w-5xl">
                    <div className="flex items-center justify-between gap-3">
                        <h1 className="text-2xl font-semibold">Cart</h1>
                        <Link href="/parts" className="text-sm font-semibold text-cyan-700">
                            Continue shopping
                        </Link>
                    </div>

                    <div className="mt-6 grid gap-5 lg:grid-cols-[1fr_320px]">
                        <section className="grid gap-3">
                            {cart.items.map((item) => {
                                const image = item.product.images.find((entry) => entry.is_main);
                                const unitPrice = item.product.discount_price ?? item.product.price;

                                return (
                                    <div
                                        key={item.id}
                                        className="grid gap-4 rounded-lg border border-slate-200 bg-white p-4 sm:grid-cols-[120px_1fr_auto]"
                                    >
                                        <div className="flex aspect-square items-center justify-center overflow-hidden rounded-md bg-slate-100">
                                            {image ? (
                                                <img src={image.path} alt={image.alt_text ?? item.product.name} className="h-full w-full object-cover" />
                                            ) : (
                                                <span className="text-xs text-slate-500">No image</span>
                                            )}
                                        </div>
                                        <div>
                                            <Link href={`/parts/${item.product.slug}`} className="font-semibold hover:text-cyan-700">
                                                {item.product.name}
                                            </Link>
                                            <p className="mt-1 text-sm text-slate-500">SKU {item.product.sku}</p>
                                            <p className="mt-3 text-sm font-medium">{unitPrice}</p>
                                        </div>
                                        <div className="flex items-center gap-2 sm:flex-col sm:items-end">
                                            <input
                                                value={item.quantity}
                                                onChange={(event) => updateQuantity(item, Number(event.target.value))}
                                                type="number"
                                                min="0"
                                                max={item.product.stock_quantity - item.product.reserved_quantity}
                                                className="w-24 rounded-md border border-slate-300 px-3 py-2 text-sm"
                                            />
                                            <button onClick={() => updateQuantity(item, 0)} className="text-sm font-semibold text-red-700">
                                                Remove
                                            </button>
                                        </div>
                                    </div>
                                );
                            })}
                            {cart.items.length === 0 ? (
                                <div className="rounded-lg border border-slate-200 bg-white p-8 text-center text-sm text-slate-500">
                                    Your cart is empty.
                                </div>
                            ) : null}
                        </section>

                        <aside className="h-fit rounded-lg border border-slate-200 bg-white p-5">
                            <h2 className="font-semibold">Order summary</h2>
                            <form
                                onSubmit={(event) => {
                                    event.preventDefault();
                                    post('/cart/discount', { preserveScroll: true });
                                }}
                                className="mt-4 grid gap-2"
                            >
                                <input
                                    value={data.discount_code}
                                    onChange={(event) => setData('discount_code', event.target.value)}
                                    className="input"
                                    placeholder="Discount code"
                                />
                                {errors.discount_code ? <p className="text-xs text-red-600">{errors.discount_code}</p> : null}
                                <button disabled={processing} className="rounded-md border border-slate-300 px-4 py-2 text-sm font-semibold disabled:opacity-60">
                                    Apply discount
                                </button>
                            </form>
                            <dl className="mt-4 grid gap-3 text-sm">
                                <div className="flex justify-between">
                                    <dt className="text-slate-500">Subtotal</dt>
                                    <dd className="font-medium">{totals.subtotal.toFixed(2)}</dd>
                                </div>
                                <div className="flex justify-between">
                                    <dt className="text-slate-500">Discount</dt>
                                    <dd className="font-medium">{totals.discount_total.toFixed(2)}</dd>
                                </div>
                                <div className="flex justify-between border-t border-slate-100 pt-3 text-base">
                                    <dt className="font-semibold">Total</dt>
                                    <dd className="font-semibold">{totals.total.toFixed(2)}</dd>
                                </div>
                            </dl>
                            <Link
                                href="/checkout"
                                className="mt-5 block rounded-md bg-cyan-700 px-4 py-2 text-center text-sm font-semibold text-white hover:bg-cyan-800"
                            >
                                Checkout
                            </Link>
                        </aside>
                    </div>
                </div>
            </main>
        </>
    );
}
