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

type Category = { id: number; name: string };
type Field = { id: number; specification_group_id: number; name: string; slug: string; type: string; unit: string | null; is_required: boolean; is_searchable: boolean; is_filterable: boolean; sort_order: number };
type Group = { id: number; category_id: number | null; name: string; sort_order: number; is_active: boolean; category: Category | null; fields: Field[] };

export default function SpecificationsIndex({ groups, categories }: { groups: Group[]; categories: Category[] }) {
    const groupForm = useForm({ category_id: '', name: '', sort_order: 0, is_active: true });
    const fieldForm = useForm({ specification_group_id: groups[0]?.id ?? '', name: '', slug: '', type: 'text', unit: '', options: '', is_required: false, is_searchable: false, is_filterable: false, sort_order: 0 });

    function createGroup(event: FormEvent) {
        event.preventDefault();
        groupForm.transform((data) => ({ ...data, category_id: data.category_id || null }));
        groupForm.post('/admin/specifications/groups', { preserveScroll: true });
    }

    function createField(event: FormEvent) {
        event.preventDefault();
        fieldForm.transform((data) => ({ ...data, unit: data.unit || null, options: String(data.options).split(',').map((item) => item.trim()).filter(Boolean) }));
        fieldForm.post('/admin/specifications/fields', { preserveScroll: true });
    }

    return (
        <>
            <Head title="Specifications" />
            <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">
                    <div className="border-b border-slate-200 pb-5"><p className="text-sm font-medium text-cyan-700">Admin</p><h1 className="text-2xl font-semibold">Specifications</h1></div>
                    <div className="mt-6 grid gap-5 lg:grid-cols-2">
                        <form onSubmit={createGroup} className="rounded-lg border border-slate-200 bg-white p-4">
                            <h2 className="font-semibold">Add group</h2>
                            <div className="mt-4 grid gap-3 sm:grid-cols-2">
                                <Field label="Category" error={groupForm.errors.category_id}><select className="input" value={groupForm.data.category_id} onChange={(event) => groupForm.setData('category_id', event.target.value)}><option value="">All categories</option>{categories.map((category) => <option key={category.id} value={category.id}>{category.name}</option>)}</select></Field>
                                <Field label="Name" error={groupForm.errors.name}><input className="input" value={groupForm.data.name} onChange={(event) => groupForm.setData('name', event.target.value)} /></Field>
                                <Field label="Sort" error={groupForm.errors.sort_order}><input className="input" type="number" min="0" value={groupForm.data.sort_order} onChange={(event) => groupForm.setData('sort_order', Number(event.target.value))} /></Field>
                                <label className="flex items-center gap-2 text-sm font-medium"><input type="checkbox" checked={groupForm.data.is_active} onChange={(event) => groupForm.setData('is_active', event.target.checked)} /> Active</label>
                            </div>
                            <button disabled={groupForm.processing} className="mt-4 rounded-md bg-cyan-700 px-4 py-2 text-sm font-semibold text-white disabled:opacity-60">Save group</button>
                        </form>

                        <form onSubmit={createField} className="rounded-lg border border-slate-200 bg-white p-4">
                            <h2 className="font-semibold">Add field</h2>
                            <div className="mt-4 grid gap-3 sm:grid-cols-2">
                                <Field label="Group" error={fieldForm.errors.specification_group_id}><select className="input" value={fieldForm.data.specification_group_id} onChange={(event) => fieldForm.setData('specification_group_id', Number(event.target.value))}>{groups.map((group) => <option key={group.id} value={group.id}>{group.name}</option>)}</select></Field>
                                <Field label="Name" error={fieldForm.errors.name}><input className="input" value={fieldForm.data.name} onChange={(event) => fieldForm.setData('name', event.target.value)} /></Field>
                                <Field label="Slug" error={fieldForm.errors.slug}><input className="input" value={fieldForm.data.slug} onChange={(event) => fieldForm.setData('slug', event.target.value)} /></Field>
                                <Field label="Type" error={fieldForm.errors.type}><select className="input" value={fieldForm.data.type} onChange={(event) => fieldForm.setData('type', event.target.value)}><option value="text">Text</option><option value="number">Number</option><option value="boolean">Boolean</option><option value="select">Select</option></select></Field>
                                <Field label="Unit" error={fieldForm.errors.unit}><input className="input" value={fieldForm.data.unit} onChange={(event) => fieldForm.setData('unit', event.target.value)} /></Field>
                                <Field label="Options" error={fieldForm.errors.options}><input className="input" value={fieldForm.data.options} onChange={(event) => fieldForm.setData('options', event.target.value)} placeholder="Comma separated" /></Field>
                                <label className="flex items-center gap-2 text-sm font-medium"><input type="checkbox" checked={fieldForm.data.is_required} onChange={(event) => fieldForm.setData('is_required', event.target.checked)} /> Required</label>
                                <label className="flex items-center gap-2 text-sm font-medium"><input type="checkbox" checked={fieldForm.data.is_searchable} onChange={(event) => fieldForm.setData('is_searchable', event.target.checked)} /> Searchable</label>
                                <label className="flex items-center gap-2 text-sm font-medium"><input type="checkbox" checked={fieldForm.data.is_filterable} onChange={(event) => fieldForm.setData('is_filterable', event.target.checked)} /> Filterable</label>
                            </div>
                            <button disabled={fieldForm.processing || groups.length === 0} className="mt-4 rounded-md bg-cyan-700 px-4 py-2 text-sm font-semibold text-white disabled:opacity-60">Save field</button>
                        </form>
                    </div>

                    <section className="mt-6 grid gap-4">
                        {groups.map((group) => (
                            <article key={group.id} className="rounded-lg border border-slate-200 bg-white p-4">
                                <div className="flex items-start justify-between gap-3">
                                    <div><h2 className="font-semibold">{group.name}</h2><p className="text-sm text-slate-500">{group.category?.name ?? 'All categories'} · {group.is_active ? 'active' : 'inactive'}</p></div>
                                    <button onClick={() => router.delete(`/admin/specifications/groups/${group.id}`, { preserveScroll: true })} className="text-sm font-semibold text-red-700">Delete</button>
                                </div>
                                <div className="mt-3 grid gap-2">
                                    {group.fields.map((field) => (
                                        <div key={field.id} className="flex flex-wrap items-center justify-between gap-3 rounded-md border border-slate-200 p-3 text-sm">
                                            <p><span className="font-medium">{field.name}</span> <span className="text-slate-500">({field.slug}, {field.type}{field.unit ? `, ${field.unit}` : ''})</span></p>
                                            <button onClick={() => router.delete(`/admin/specifications/fields/${field.id}`, { preserveScroll: true })} className="font-semibold text-red-700">Delete</button>
                                        </div>
                                    ))}
                                </div>
                            </article>
                        ))}
                    </section>
                </div>
            </main>
        </>
    );
}

function Field({ label, error, children }: { label: string; error?: string; children: React.ReactNode }) {
    return <label className="grid gap-1 text-sm font-medium text-slate-700"><span>{label}</span>{children}{error ? <span className="text-xs text-red-600">{error}</span> : null}</label>;
}
