import { Head, router, usePage } from '@inertiajs/react';
import { useState } from 'react';
import { Save, Send, Trash2, Plus } from 'lucide-react';

type Metric = { key: string; name: string; unit: string; data_domain: string };
type Widget = { id: string; type: string; title?: string; metric?: string };
type Org = { id: number; name: string };

export default function StudioEdit() {
    const props = usePage().props as unknown as {
        dashboard: { id: number; name: string; status: string };
        layout: { widgets: Widget[] };
        metrics: Metric[];
        organizations: Org[];
        assignments: number[];
    };
    const { dashboard, metrics, organizations } = props;

    const [widgets, setWidgets] = useState<Widget[]>(props.layout.widgets ?? []);
    const [assigned, setAssigned] = useState<number[]>(props.assignments ?? []);
    const [picker, setPicker] = useState('');

    const addKpi = () => {
        const m = metrics.find((x) => x.key === picker);
        if (!m) return;
        setWidgets([...widgets, { id: crypto.randomUUID(), type: 'kpi', title: m.name, metric: m.key }]);
        setPicker('');
    };
    const removeWidget = (id: string) => setWidgets(widgets.filter((w) => w.id !== id));

    const save = (publish: boolean) => {
        const url = `/admin/studio/${dashboard.id}/${publish ? 'publish' : 'draft'}`;
        router.post(url, { layout: { widgets } }, { preserveScroll: true });
    };
    const saveAssign = () =>
        router.post(`/admin/studio/${dashboard.id}/assign`, { organization_ids: assigned }, { preserveScroll: true });

    return (
        <>
            <Head title={`Edit — ${dashboard.name}`} />
            <div className="mx-auto w-full max-w-6xl px-6 py-8">
                <header className="mb-6 flex items-center justify-between">
                    <h1 className="text-2xl font-semibold tracking-tight text-foreground">{dashboard.name}</h1>
                    <div className="flex gap-2">
                        <button onClick={() => save(false)} className="inline-flex items-center gap-1.5 rounded-md border border-border px-3.5 py-2 text-sm font-medium hover:bg-muted">
                            <Save className="size-4" /> Save draft
                        </button>
                        <button onClick={() => save(true)} className="inline-flex items-center gap-1.5 rounded-md bg-primary px-3.5 py-2 text-sm font-medium text-primary-foreground hover:opacity-90">
                            <Send className="size-4" /> Publish
                        </button>
                    </div>
                </header>

                <div className="grid gap-6 lg:grid-cols-3">
                    <div className="lg:col-span-2">
                        <div className="mb-4 flex gap-2">
                            <select value={picker} onChange={(e) => setPicker(e.target.value)}
                                className="flex-1 rounded-md border border-border bg-background px-3 py-2 text-sm">
                                <option value="">Add a KPI from a governed metric…</option>
                                {metrics.map((m) => <option key={m.key} value={m.key}>{m.name} ({m.unit})</option>)}
                            </select>
                            <button onClick={addKpi} disabled={!picker}
                                className="inline-flex items-center gap-1.5 rounded-md bg-primary px-3.5 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50">
                                <Plus className="size-4" /> Add
                            </button>
                        </div>

                        <div className="grid gap-3 sm:grid-cols-2">
                            {widgets.map((w) => (
                                <div key={w.id} className="flex items-center justify-between rounded-xl border border-border bg-card p-4">
                                    <div>
                                        <p className="text-xs uppercase tracking-wide text-muted-foreground">{w.type}</p>
                                        <p className="font-medium text-foreground">{w.title}</p>
                                        <p className="text-xs text-muted-foreground">{w.metric}</p>
                                    </div>
                                    <button onClick={() => removeWidget(w.id)} className="text-muted-foreground hover:text-destructive">
                                        <Trash2 className="size-4" />
                                    </button>
                                </div>
                            ))}
                            {widgets.length === 0 && (
                                <p className="col-span-2 rounded-xl border border-dashed border-border p-8 text-center text-sm text-muted-foreground">
                                    No widgets yet. Add a KPI above.
                                </p>
                            )}
                        </div>
                    </div>

                    <div>
                        <div className="rounded-xl border border-border bg-card p-5">
                            <h2 className="mb-3 font-medium text-foreground">Assign to organizations</h2>
                            <div className="space-y-2">
                                {organizations.map((o) => (
                                    <label key={o.id} className="flex items-center gap-2 text-sm">
                                        <input type="checkbox" checked={assigned.includes(o.id)}
                                            onChange={(e) => setAssigned(e.target.checked ? [...assigned, o.id] : assigned.filter((x) => x !== o.id))} />
                                        {o.name}
                                    </label>
                                ))}
                            </div>
                            <button onClick={saveAssign} className="mt-4 w-full rounded-md border border-border py-2 text-sm font-medium hover:bg-muted">
                                Save assignments
                            </button>
                        </div>
                    </div>
                </div>
            </div>
        </>
    );
}
