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

type Brand = { id: number; name: string; slug: string; is_active: boolean; products_count: number };
type Pagination<T> = { data: T[]; links: { url: string | null; label: string; active: boolean }[] };

export default function BrandsIndex({ brands, filters }: { brands: Pagination<Brand>; filters: { search: string } }) {
    const [search, setSearch] = useState(filters.search ?? '');

    function submit(event: FormEvent) {
        event.preventDefault();
        router.get('/admin/brands', { search }, { preserveState: true });
    }

    return (
        <>
            <Head title="Admin Brands" />
            <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">
                    <Header title="Brands" href="/admin/brands/create" label="Add brand" />
                    <form onSubmit={submit} className="mt-6 flex gap-3">
                        <input className="input" value={search} onChange={(event) => setSearch(event.target.value)} placeholder="Search brands" />
                        <button className="rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-semibold">Search</button>
                    </form>
                    <div className="mt-5 divide-y divide-slate-200 overflow-hidden rounded-lg border border-slate-200 bg-white">
                        {brands.data.map((brand) => (
                            <div key={brand.id} className="grid gap-3 p-4 sm:grid-cols-[1fr_auto] sm:items-center">
                                <div>
                                    <h2 className="font-semibold">{brand.name}</h2>
                                    <p className="text-sm text-slate-500">{brand.slug} · {brand.products_count} products · {brand.is_active ? 'active' : 'inactive'}</p>
                                </div>
                                <Link href={`/admin/brands/${brand.id}/edit`} className="text-sm font-semibold text-cyan-700">Edit</Link>
                            </div>
                        ))}
                    </div>
                    <Pagination links={brands.links} />
                </div>
            </main>
        </>
    );
}

function Header({ title, href, label }: { title: string; href: string; label: string }) {
    return <div className="flex items-end justify-between gap-3 border-b border-slate-200 pb-5"><div><p className="text-sm font-medium text-cyan-700">Admin</p><h1 className="text-2xl font-semibold">{title}</h1></div><Link href={href} className="rounded-md bg-cyan-700 px-4 py-2 text-sm font-semibold text-white">{label}</Link></div>;
}

function Pagination({ links }: { links: Pagination<unknown>['links'] }) {
    return <nav className="mt-5 flex flex-wrap gap-2">{links.map((link) => <Link key={link.label} href={link.url ?? '#'} className={`rounded-md border px-3 py-2 text-sm ${link.active ? 'border-cyan-700 bg-cyan-700 text-white' : 'border-slate-300 bg-white text-slate-700'} ${link.url ? '' : 'pointer-events-none opacity-50'}`} dangerouslySetInnerHTML={{ __html: link.label }} />)}</nav>;
}
