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

type Product = {
    id: number;
    name: string;
    sku: string;
    condition: string;
    status: string;
    price: string;
    discount_price: string | null;
    stock_quantity: number;
    reserved_quantity: number;
    description: string | null;
    brand: { name: string } | null;
    category: { name: string } | null;
    images: { path: string; alt_text: string | null; is_main: boolean }[];
    part_numbers: { type: string; number: string }[];
    tags: { name: string }[];
    specification_values: {
        id: number;
        value: string;
        field: {
            name: string;
            unit: string | null;
            group: { name: string } | null;
        };
    }[];
    compatibilities: {
        id: number;
        make: { name: string } | null;
        model: { name: string } | null;
        generation: { name: string; code: string | null } | null;
        year_from: number | null;
        year_to: number | null;
        engine_code: string | null;
        transmission_type: string | null;
        drive_type: string | null;
        chassis_code: string | null;
    }[];
};

export default function ProductShow({ product }: { product: Product }) {
    const mainImage = product.images.find((image) => image.is_main);
    const { data, setData, post, processing } = useForm({ quantity: 1 });
    const specifications = Object.entries(
        product.specification_values.reduce(
            (groups, item) => {
                const group = item.field.group?.name ?? 'Specifications';
                groups[group] = [...(groups[group] ?? []), item];

                return groups;
            },
            {} as Record<string, Product['specification_values']>,
        ),
    );

    return (
        <>
            <Head title={product.name} />
            <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-7xl">
                    <Link
                        href="/parts"
                        className="text-sm font-semibold text-cyan-700"
                    >
                        Back to parts
                    </Link>

                    <section className="mt-5 grid gap-6 lg:grid-cols-[minmax(0,1fr)_420px]">
                        <div className="rounded-lg border border-slate-200 bg-white p-4">
                            <div className="flex aspect-[4/3] items-center justify-center overflow-hidden rounded-md bg-slate-100">
                                {mainImage ? (
                                    <img
                                        src={mainImage.path}
                                        alt={mainImage.alt_text ?? product.name}
                                        className="h-full w-full object-cover"
                                    />
                                ) : (
                                    <span className="text-sm text-slate-500">
                                        No image
                                    </span>
                                )}
                            </div>
                        </div>

                        <aside className="rounded-lg border border-slate-200 bg-white p-5">
                            <p className="text-sm font-medium text-cyan-700">
                                {product.brand?.name ?? 'Auto part'}
                            </p>
                            <h1 className="mt-2 text-3xl font-semibold">
                                {product.name}
                            </h1>
                            <p className="mt-2 text-sm text-slate-500">
                                SKU {product.sku}
                            </p>
                            <p className="mt-5 text-3xl font-semibold">
                                {product.discount_price ?? product.price}
                            </p>
                            <form
                                onSubmit={(event) => {
                                    event.preventDefault();
                                    post(`/cart/${product.id}`);
                                }}
                                className="mt-5 flex gap-2"
                            >
                                <input
                                    value={data.quantity}
                                    onChange={(event) =>
                                        setData(
                                            'quantity',
                                            Number(event.target.value),
                                        )
                                    }
                                    type="number"
                                    min="1"
                                    className="w-24 rounded-md border border-slate-300 px-3 py-2 text-sm"
                                />
                                <button
                                    disabled={processing}
                                    className="flex-1 rounded-md bg-cyan-700 px-4 py-2 text-sm font-semibold text-white hover:bg-cyan-800 disabled:opacity-60"
                                >
                                    Add to cart
                                </button>
                            </form>
                            <dl className="mt-5 grid grid-cols-2 gap-3 text-sm">
                                <div>
                                    <dt className="text-slate-500">Stock</dt>
                                    <dd className="font-medium">
                                        {product.stock_quantity -
                                            product.reserved_quantity >
                                        0
                                            ? 'In stock'
                                            : 'Out of stock'}
                                    </dd>
                                </div>
                                <div>
                                    <dt className="text-slate-500">
                                        Condition
                                    </dt>
                                    <dd className="font-medium capitalize">
                                        {product.condition}
                                    </dd>
                                </div>
                                <div>
                                    <dt className="text-slate-500">Brand</dt>
                                    <dd className="font-medium">
                                        {product.brand?.name ?? '-'}
                                    </dd>
                                </div>
                                <div>
                                    <dt className="text-slate-500">Category</dt>
                                    <dd className="font-medium">
                                        {product.category?.name ?? '-'}
                                    </dd>
                                </div>
                            </dl>
                            <div className="mt-5 rounded-md border border-amber-200 bg-amber-50 p-3 text-sm text-amber-900">
                                Please verify OEM number, connector type, pin
                                count, engine code, and production year before
                                ordering.
                            </div>
                        </aside>
                    </section>

                    <section className="mt-6 grid gap-6 lg:grid-cols-2">
                        <div className="rounded-lg border border-slate-200 bg-white p-5">
                            <h2 className="text-lg font-semibold">
                                Description
                            </h2>
                            <p className="mt-3 whitespace-pre-line text-sm leading-6 text-slate-700">
                                {product.description ?? 'No description yet.'}
                            </p>
                        </div>
                        <div className="rounded-lg border border-slate-200 bg-white p-5">
                            <h2 className="text-lg font-semibold">
                                Part numbers
                            </h2>
                            <dl className="mt-3 grid gap-3 text-sm">
                                {product.part_numbers.map((partNumber) => (
                                    <div
                                        key={`${partNumber.type}-${partNumber.number}`}
                                        className="flex justify-between gap-4 border-b border-slate-100 pb-2"
                                    >
                                        <dt className="capitalize text-slate-500">
                                            {partNumber.type.replace('_', ' ')}
                                        </dt>
                                        <dd className="font-medium">
                                            {partNumber.number}
                                        </dd>
                                    </div>
                                ))}
                            </dl>
                        </div>
                    </section>

                    <section className="mt-6 rounded-lg border border-slate-200 bg-white p-5">
                        <h2 className="text-lg font-semibold">
                            Technical specifications
                        </h2>
                        <div className="mt-3 grid gap-5 md:grid-cols-2">
                            {specifications.map(([group, values]) => (
                                <div key={group}>
                                    <h3 className="text-sm font-semibold text-slate-700">
                                        {group}
                                    </h3>
                                    <dl className="mt-2 grid gap-2 text-sm">
                                        {values.map((item) => (
                                            <div
                                                key={item.id}
                                                className="flex justify-between gap-4 border-b border-slate-100 pb-2"
                                            >
                                                <dt className="text-slate-500">
                                                    {item.field.name}
                                                </dt>
                                                <dd className="font-medium">
                                                    {item.value}
                                                    {item.field.unit
                                                        ? ` ${item.field.unit}`
                                                        : ''}
                                                </dd>
                                            </div>
                                        ))}
                                    </dl>
                                </div>
                            ))}
                            {specifications.length === 0 ? (
                                <p className="text-sm text-slate-500">
                                    No technical specifications are available
                                    yet.
                                </p>
                            ) : null}
                        </div>
                    </section>

                    <section className="mt-6 rounded-lg border border-slate-200 bg-white p-5">
                        <h2 className="text-lg font-semibold">
                            Vehicle compatibility
                        </h2>
                        <div className="mt-3 grid gap-3">
                            {product.compatibilities.map((compatibility) => (
                                <div
                                    key={compatibility.id}
                                    className="grid gap-2 rounded-md border border-slate-200 p-3 text-sm md:grid-cols-5"
                                >
                                    <div>
                                        <p className="text-xs text-slate-500">
                                            Vehicle
                                        </p>
                                        <p className="font-medium">
                                            {compatibility.make?.name ?? '-'}{' '}
                                            {compatibility.model?.name ?? ''}
                                        </p>
                                    </div>
                                    <div>
                                        <p className="text-xs text-slate-500">
                                            Generation
                                        </p>
                                        <p className="font-medium">
                                            {compatibility.generation?.code ??
                                                compatibility.generation
                                                    ?.name ??
                                                '-'}
                                        </p>
                                    </div>
                                    <div>
                                        <p className="text-xs text-slate-500">
                                            Years
                                        </p>
                                        <p className="font-medium">
                                            {compatibility.year_from ?? '-'} -{' '}
                                            {compatibility.year_to ?? '-'}
                                        </p>
                                    </div>
                                    <div>
                                        <p className="text-xs text-slate-500">
                                            Engine
                                        </p>
                                        <p className="font-medium">
                                            {compatibility.engine_code ?? '-'}
                                        </p>
                                    </div>
                                    <div>
                                        <p className="text-xs text-slate-500">
                                            Transmission
                                        </p>
                                        <p className="font-medium capitalize">
                                            {compatibility.transmission_type ??
                                                'Any'}
                                        </p>
                                    </div>
                                </div>
                            ))}
                            {product.compatibilities.length === 0 ? (
                                <p className="text-sm text-slate-500">
                                    No vehicle compatibility data is available
                                    yet.
                                </p>
                            ) : null}
                        </div>
                    </section>
                </div>
            </main>
        </>
    );
}
