import { Head, router, useForm } from '@inertiajs/react';
import { ChevronDown, ChevronUp, Edit2, Plus, Save, Tag, Trash2, X } from 'lucide-react';
import { useState } from 'react';

import AdminLayout from '@/layouts/admin-layout';

interface AttributeValue {
    id: number;
    value: string;
    slug: string;
}

interface Attribute {
    id: number;
    name: string;
    slug: string;
    values: AttributeValue[];
}

export default function AttributesIndex({ attributes }: { attributes: Attribute[] }) {
    const [expanded, setExpanded] = useState<number | null>(null);
    const [editingAttr, setEditingAttr] = useState<number | null>(null);
    const [editName, setEditName] = useState('');

    const createForm = useForm({ name: '' });
    const valueForm = useForm({ value: '' });

    const submitCreate = (e: React.FormEvent) => {
        e.preventDefault();
        createForm.post('/admin/attributes', { onSuccess: () => createForm.reset() });
    };

    const submitEdit = (attr: Attribute) => {
        router.patch(`/admin/attributes/${attr.id}`, { name: editName }, {
            onSuccess: () => setEditingAttr(null),
        });
    };

    const deleteAttr = (id: number) => {
        if (!confirm('Delete attribute and all its values?')) return;
        router.delete(`/admin/attributes/${id}`);
    };

    const addValue = (e: React.FormEvent, attrId: number) => {
        e.preventDefault();
        valueForm.post(`/admin/attributes/${attrId}/values`, { onSuccess: () => valueForm.reset() });
    };

    const deleteValue = (attrId: number, valueId: number) => {
        router.delete(`/admin/attributes/${attrId}/values/${valueId}`);
    };

    return (
        <AdminLayout>
            <Head title="Attributes" />

            <div className="mx-auto max-w-3xl space-y-6 p-6">
                <div className="flex items-center gap-3">
                    <div className="rounded-xl bg-indigo-100 p-2.5">
                        <Tag size={20} className="text-indigo-600" />
                    </div>
                    <div>
                        <h1 className="text-xl font-bold text-slate-800">Product Attributes</h1>
                        <p className="text-sm text-slate-500">Manage size, color, and other variation attributes</p>
                    </div>
                </div>

                {/* Create Attribute */}
                <form onSubmit={submitCreate} className="flex gap-2">
                    <input
                        value={createForm.data.name}
                        onChange={(e) => createForm.setData('name', e.target.value)}
                        placeholder="New attribute name (e.g. Size, Color)"
                        className="flex-1 rounded-xl border border-slate-200 px-4 py-2.5 text-sm focus:border-indigo-400 focus:outline-none focus:ring-2 focus:ring-indigo-100"
                    />
                    <button
                        type="submit"
                        disabled={createForm.processing}
                        className="flex items-center gap-1.5 rounded-xl bg-indigo-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-indigo-700 disabled:opacity-60"
                    >
                        <Plus size={16} /> Add Attribute
                    </button>
                </form>
                {createForm.errors.name && <p className="text-xs text-red-500">{createForm.errors.name}</p>}

                {/* Attribute List */}
                <div className="space-y-3">
                    {attributes.length === 0 && (
                        <div className="rounded-xl border border-dashed border-slate-200 py-12 text-center text-slate-400">
                            No attributes yet. Add one above.
                        </div>
                    )}
                    {attributes.map((attr) => (
                        <div key={attr.id} className="overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm">
                            {/* Header */}
                            <div className="flex items-center gap-3 px-4 py-3">
                                {editingAttr === attr.id ? (
                                    <div className="flex flex-1 items-center gap-2">
                                        <input
                                            value={editName}
                                            onChange={(e) => setEditName(e.target.value)}
                                            className="flex-1 rounded-lg border border-indigo-300 px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-100"
                                            autoFocus
                                        />
                                        <button
                                            onClick={() => submitEdit(attr)}
                                            className="rounded-lg bg-indigo-600 px-3 py-1.5 text-xs font-semibold text-white hover:bg-indigo-700"
                                        >
                                            <Save size={13} />
                                        </button>
                                        <button
                                            onClick={() => setEditingAttr(null)}
                                            className="rounded-lg border px-3 py-1.5 text-xs text-slate-500 hover:bg-slate-50"
                                        >
                                            <X size={13} />
                                        </button>
                                    </div>
                                ) : (
                                    <button
                                        className="flex flex-1 items-center gap-2 text-left"
                                        onClick={() => setExpanded(expanded === attr.id ? null : attr.id)}
                                    >
                                        <span className="font-semibold text-slate-800">{attr.name}</span>
                                        <span className="rounded-full bg-slate-100 px-2 py-0.5 text-xs text-slate-500">
                                            {attr.values.length} values
                                        </span>
                                        {expanded === attr.id ? (
                                            <ChevronUp size={16} className="ml-auto text-slate-400" />
                                        ) : (
                                            <ChevronDown size={16} className="ml-auto text-slate-400" />
                                        )}
                                    </button>
                                )}
                                {editingAttr !== attr.id && (
                                    <div className="flex gap-1">
                                        <button
                                            onClick={() => { setEditingAttr(attr.id); setEditName(attr.name); }}
                                            className="rounded-lg p-1.5 text-slate-400 hover:bg-slate-100 hover:text-indigo-600"
                                        >
                                            <Edit2 size={14} />
                                        </button>
                                        <button
                                            onClick={() => deleteAttr(attr.id)}
                                            className="rounded-lg p-1.5 text-slate-400 hover:bg-red-50 hover:text-red-500"
                                        >
                                            <Trash2 size={14} />
                                        </button>
                                    </div>
                                )}
                            </div>

                            {/* Values */}
                            {expanded === attr.id && (
                                <div className="border-t border-slate-100 bg-slate-50 px-4 py-3">
                                    <div className="mb-3 flex flex-wrap gap-2">
                                        {attr.values.map((v) => (
                                            <div
                                                key={v.id}
                                                className="flex items-center gap-1.5 rounded-full border border-slate-200 bg-white px-3 py-1 text-sm text-slate-700 shadow-sm"
                                            >
                                                {v.value}
                                                <button
                                                    onClick={() => deleteValue(attr.id, v.id)}
                                                    className="text-slate-300 hover:text-red-500"
                                                >
                                                    <X size={12} />
                                                </button>
                                            </div>
                                        ))}
                                        {attr.values.length === 0 && (
                                            <span className="text-xs text-slate-400">No values yet</span>
                                        )}
                                    </div>
                                    <form onSubmit={(e) => addValue(e, attr.id)} className="flex gap-2">
                                        <input
                                            value={valueForm.data.value}
                                            onChange={(e) => valueForm.setData('value', e.target.value)}
                                            placeholder="Add value (e.g. Large, Red)"
                                            className="flex-1 rounded-lg border border-slate-200 bg-white px-3 py-1.5 text-sm focus:border-indigo-400 focus:outline-none focus:ring-2 focus:ring-indigo-100"
                                        />
                                        <button
                                            type="submit"
                                            disabled={valueForm.processing}
                                            className="flex items-center gap-1 rounded-lg bg-indigo-600 px-3 py-1.5 text-xs font-semibold text-white hover:bg-indigo-700 disabled:opacity-60"
                                        >
                                            <Plus size={13} /> Add
                                        </button>
                                    </form>
                                </div>
                            )}
                        </div>
                    ))}
                </div>
            </div>
        </AdminLayout>
    );
}
