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

type Metric = { key: string; name: string; unit: string };
type Goal = {
    id: number; name: string; metric_key: string; direction: string; target_value: number;
    current: number | null; unit: string; progress: number; achieved: boolean;
    due_date: string | null; status: string;
};

function fmt(v: number | null, unit: string) {
    if (v === null) return '—';
    if (unit === 'currency') return '$' + v.toLocaleString();
    if (unit === 'percent') return v + '%';
    return v.toLocaleString();
}

export default function Goals() {
    const props = usePage().props as unknown as { goals: Goal[]; metrics: Metric[] };
    const { goals, metrics } = props;
    const [form, setForm] = useState({ name: '', metric_key: '', direction: 'increase', target_value: '', due_date: '' });

    const create = () => {
        if (!form.name || !form.metric_key || form.target_value === '') return;
        router.post('/goals', { ...form, target_value: parseFloat(form.target_value) }, {
            preserveScroll: true, onSuccess: () => setForm({ name: '', metric_key: '', direction: 'increase', target_value: '', due_date: '' }),
        });
    };

    return (
        <>
            <Head title="Goals & OKRs" />
            <div className="mx-auto w-full max-w-4xl px-6 py-8">
                <h1 className="mb-6 flex items-center gap-2 text-2xl font-semibold tracking-tight text-foreground">
                    <Target className="size-5 text-primary" /> Goals &amp; OKRs
                </h1>

                <section className="mb-8 rounded-xl border border-border bg-card p-5">
                    <h2 className="mb-3 flex items-center gap-2 font-medium text-foreground"><Plus className="size-4 text-primary" /> New goal</h2>
                    <div className="grid gap-3 sm:grid-cols-2">
                        <input value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} placeholder="Goal name"
                            className="rounded-md border border-border bg-background px-3 py-2 text-sm sm:col-span-2" />
                        <select value={form.metric_key} onChange={(e) => setForm({ ...form, metric_key: e.target.value })}
                            className="rounded-md border border-border bg-background px-3 py-2 text-sm">
                            <option value="">Select metric…</option>
                            {metrics.map((m) => <option key={m.key} value={m.key}>{m.name}</option>)}
                        </select>
                        <select value={form.direction} onChange={(e) => setForm({ ...form, direction: e.target.value })}
                            className="rounded-md border border-border bg-background px-3 py-2 text-sm">
                            <option value="increase">Increase to</option><option value="decrease">Decrease to</option>
                        </select>
                        <input value={form.target_value} onChange={(e) => setForm({ ...form, target_value: e.target.value })} type="number" placeholder="Target value"
                            className="rounded-md border border-border bg-background px-3 py-2 text-sm" />
                        <input value={form.due_date} onChange={(e) => setForm({ ...form, due_date: e.target.value })} type="date"
                            className="rounded-md border border-border bg-background px-3 py-2 text-sm" />
                        <button onClick={create} className="rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 sm:col-span-2">
                            Create goal
                        </button>
                    </div>
                </section>

                <div className="space-y-3">
                    {goals.map((g) => (
                        <div key={g.id} className="rounded-xl border border-border bg-card p-5">
                            <div className="flex items-start justify-between">
                                <div>
                                    <div className="flex items-center gap-2">
                                        <span className="font-medium text-foreground">{g.name}</span>
                                        {g.achieved && <CheckCircle2 className="size-4 text-emerald-600" />}
                                    </div>
                                    <p className="mt-0.5 text-xs text-muted-foreground">
                                        {fmt(g.current, g.unit)} of {fmt(g.target_value, g.unit)} target
                                        {g.due_date && ` · due ${g.due_date}`}
                                    </p>
                                </div>
                                <button onClick={() => router.delete(`/goals/${g.id}`, { preserveScroll: true })}
                                    className="rounded p-1.5 text-muted-foreground hover:text-destructive"><Trash2 className="size-4" /></button>
                            </div>
                            <div className="mt-3 h-2 overflow-hidden rounded-full bg-muted">
                                <div className={`h-full rounded-full ${g.achieved ? 'bg-emerald-500' : 'bg-primary'}`} style={{ width: `${g.progress}%` }} />
                            </div>
                            <p className="mt-1 text-right text-xs text-muted-foreground">{g.progress}%</p>
                        </div>
                    ))}
                    {goals.length === 0 && (
                        <p className="rounded-xl border border-dashed border-border p-8 text-center text-sm text-muted-foreground">
                            No goals yet. Set one above to track a metric against a target.
                        </p>
                    )}
                </div>
            </div>
        </>
    );
}
