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

type Product = {
    id: number;
    name: string;
    slug: string;
    sku: string;
    condition: string;
    price: string;
    discount_price: string | null;
    stock_quantity: number;
    reserved_quantity: number;
    brand: { name: string } | null;
    category: { name: string } | null;
    images: { path: string; alt_text: string | null; is_main: boolean }[];
};

type Pagination<T> = {
    data: T[];
    links: { url: string | null; label: string; active: boolean }[];
};
type Filters = {
    search: string;
    make: string;
    model: string;
    year: number | null;
    engine: string;
    transmission: string;
};
type VehicleMake = {
    id: number;
    name: string;
    slug: string;
    models: { id: number; name: string; slug: string }[];
};

export default function ProductIndex({
    products,
    filters,
    vehicleMakes,
}: {
    products: Pagination<Product>;
    filters: Filters;
    vehicleMakes: VehicleMake[];
}) {
    const [search, setSearch] = useState(filters.search ?? '');
    const [make, setMake] = useState(filters.make ?? '');
    const [model, setModel] = useState(filters.model ?? '');
    const [year, setYear] = useState(filters.year ? String(filters.year) : '');
    const [engine, setEngine] = useState(filters.engine ?? '');
    const [transmission, setTransmission] = useState(
        filters.transmission ?? '',
    );

    function submit(event: FormEvent) {
        event.preventDefault();
        router.get(
            '/parts',
            { search, make, model, year, engine, transmission },
            { preserveState: true, preserveScroll: true },
        );
    }

    const modelOptions =
        vehicleMakes.find((vehicleMake) => vehicleMake.slug === make)?.models ??
        [];

    return (
        <>
            <Head title="Auto Parts" />
            <main className="min-h-screen bg-slate-50 text-slate-900">
                <section className="border-b border-slate-200 bg-white px-4 py-8 sm:px-6 lg:px-8">
                    <div className="mx-auto max-w-7xl">
                        <h1 className="text-3xl font-semibold tracking-normal">
                            Auto parts catalog
                        </h1>
                        <form
                            onSubmit={submit}
                            className="mt-5 grid gap-3 md:grid-cols-2 lg:grid-cols-[1fr_180px_180px_120px_160px_150px_auto]"
                        >
                            <input
                                value={search}
                                onChange={(event) =>
                                    setSearch(event.target.value)
                                }
                                placeholder="Search by product, SKU, OEM or alternative number"
                                className="w-full rounded-md border border-slate-300 bg-white px-3 py-2 text-sm focus:border-cyan-600 focus:ring-cyan-600"
                            />
                            <select
                                value={make}
                                onChange={(event) => {
                                    setMake(event.target.value);
                                    setModel('');
                                }}
                                className="rounded-md border border-slate-300 bg-white px-3 py-2 text-sm focus:border-cyan-600 focus:ring-cyan-600"
                            >
                                <option value="">Any make</option>
                                {vehicleMakes.map((vehicleMake) => (
                                    <option
                                        key={vehicleMake.id}
                                        value={vehicleMake.slug}
                                    >
                                        {vehicleMake.name}
                                    </option>
                                ))}
                            </select>
                            <select
                                value={model}
                                onChange={(event) =>
                                    setModel(event.target.value)
                                }
                                className="rounded-md border border-slate-300 bg-white px-3 py-2 text-sm focus:border-cyan-600 focus:ring-cyan-600"
                            >
                                <option value="">Any model</option>
                                {modelOptions.map((vehicleModel) => (
                                    <option
                                        key={vehicleModel.id}
                                        value={vehicleModel.slug}
                                    >
                                        {vehicleModel.name}
                                    </option>
                                ))}
                            </select>
                            <input
                                value={year}
                                onChange={(event) => setYear(event.target.value)}
                                placeholder="Year"
                                type="number"
                                min="1900"
                                max="2100"
                                className="rounded-md border border-slate-300 bg-white px-3 py-2 text-sm focus:border-cyan-600 focus:ring-cyan-600"
                            />
                            <input
                                value={engine}
                                onChange={(event) =>
                                    setEngine(event.target.value)
                                }
                                placeholder="Engine code"
                                className="rounded-md border border-slate-300 bg-white px-3 py-2 text-sm focus:border-cyan-600 focus:ring-cyan-600"
                            />
                            <select
                                value={transmission}
                                onChange={(event) =>
                                    setTransmission(event.target.value)
                                }
                                className="rounded-md border border-slate-300 bg-white px-3 py-2 text-sm focus:border-cyan-600 focus:ring-cyan-600"
                            >
                                <option value="">Any gearbox</option>
                                <option value="manual">Manual</option>
                                <option value="automatic">Automatic</option>
                            </select>
                            <button className="rounded-md bg-cyan-700 px-5 py-2 text-sm font-semibold text-white hover:bg-cyan-800">
                                Search
                            </button>
                        </form>
                    </div>
                </section>

                <section className="px-4 py-6 sm:px-6 lg:px-8">
                    <div className="mx-auto grid max-w-7xl gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
                        {products.data.map((product) => {
                            const image = product.images.find(
                                (item) => item.is_main,
                            );

                            return (
                                <Link
                                    key={product.id}
                                    href={`/parts/${product.slug}`}
                                    className="rounded-lg border border-slate-200 bg-white p-4 shadow-sm transition hover:border-cyan-600"
                                >
                                    <div className="flex aspect-[4/3] items-center justify-center overflow-hidden rounded-md bg-slate-100">
                                        {image ? (
                                            <img
                                                src={image.path}
                                                alt={
                                                    image.alt_text ??
                                                    product.name
                                                }
                                                className="h-full w-full object-cover"
                                                loading="lazy"
                                            />
                                        ) : (
                                            <span className="text-sm text-slate-500">
                                                No image
                                            </span>
                                        )}
                                    </div>
                                    <div className="mt-4">
                                        <p className="text-xs font-medium uppercase text-cyan-700">
                                            {product.brand?.name ?? 'Brand'}
                                        </p>
                                        <h2 className="mt-1 line-clamp-2 font-semibold">
                                            {product.name}
                                        </h2>
                                        <p className="mt-1 text-xs text-slate-500">
                                            SKU {product.sku}
                                        </p>
                                        <div className="mt-3 flex items-center justify-between gap-3">
                                            <p className="text-lg font-semibold">
                                                {product.discount_price ??
                                                    product.price}
                                            </p>
                                            <p className="text-xs text-slate-600">
                                                {product.stock_quantity -
                                                    product.reserved_quantity >
                                                0
                                                    ? 'In stock'
                                                    : 'Out of stock'}
                                            </p>
                                        </div>
                                    </div>
                                </Link>
                            );
                        })}
                    </div>
                </section>
            </main>
        </>
    );
}
