import { Head, Link, router, useForm } from '@inertiajs/react';
import { CalendarDays, ChevronLeft, ChevronRight, Printer } from 'lucide-react';
import { EmptyState } from '@/components/empty-state';
import { PageHeader } from '@/components/page-header';
import { StatusBadge  } from '@/components/status-badge';
import type {StatusTone} from '@/components/status-badge';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import { assign as rosterAssign, index, print } from '@/routes/roster';
import { update as attendanceUpdate } from '@/routes/roster/attendance';

type Option = { value: number | string; label: string };

type Attendee = {
    id: number;
    name: string | null;
    role: string;
    status: string;
    status_label: string;
    status_tone: StatusTone;
    covered_by: string | null;
};

type HearingCell = {
    id: string;
    matter_id: string;
    matter_number: string;
    matter_title: string;
    date: string;
    time: string | null;
    court: string;
    type: string;
    status: string;
    attendees: Attendee[];
};

type Props = {
    view: 'day' | 'week';
    date: string;
    days: string[];
    hearings: HearingCell[];
    attendanceStatuses: Option[];
    roles: Option[];
    users: Option[];
    canManage: boolean;
    canConfirm: boolean;
};

function AssignForm({ hearingId, roles, users }: { hearingId: string; roles: Option[]; users: Option[] }) {
    const form = useForm({ user_id: '', role: 'lead' });
    const submit = (e: React.FormEvent) => {
        e.preventDefault();
        form.post(rosterAssign(hearingId).url, { preserveScroll: true, onSuccess: () => form.reset() });
    };

    return (
        <form onSubmit={submit} className="mt-2 flex items-end gap-2">
            <Select value={form.data.user_id} onValueChange={(v) => form.setData('user_id', v)}>
                <SelectTrigger className="h-7 flex-1 text-xs"><SelectValue placeholder="Assign lawyer" /></SelectTrigger>
                <SelectContent>
                    {users.map((u) => (
                        <SelectItem key={u.value} value={String(u.value)}>{u.label}</SelectItem>
                    ))}
                </SelectContent>
            </Select>
            <Select value={form.data.role} onValueChange={(v) => form.setData('role', v)}>
                <SelectTrigger className="h-7 w-28 text-xs"><SelectValue /></SelectTrigger>
                <SelectContent>
                    {roles.map((r) => (
                        <SelectItem key={r.value} value={String(r.value)}>{r.label}</SelectItem>
                    ))}
                </SelectContent>
            </Select>
            <Button type="submit" size="xs" disabled={!form.data.user_id}>Add</Button>
        </form>
    );
}

export default function RosterIndex({
    view,
    date,
    hearings,
    attendanceStatuses,
    roles,
    users,
    canManage,
    canConfirm,
}: Props) {
    const shift = (dir: number) => {
        const d = new Date(date);
        d.setDate(d.getDate() + dir * (view === 'week' ? 7 : 1));
        router.get(index().url, { date: d.toISOString().slice(0, 10), view }, { preserveState: true });
    };

    const setView = (v: string) => router.get(index().url, { date, view: v }, { preserveState: true });

    const byCourt = hearings.reduce<Record<string, HearingCell[]>>((acc, h) => {
        (acc[h.court] ??= []).push(h);

        return acc;
    }, {});

    const setStatus = (attendanceId: number, status: string) => {
        router.patch(attendanceUpdate(attendanceId).url, { status }, { preserveScroll: true });
    };

    return (
        <>
            <Head title="Court roster" />
            <div className="flex flex-col gap-6 p-4">
                <PageHeader
                    title="Court roster"
                    subtitle="Who is appearing where, and when."
                    action={
                        <Button asChild variant="outline">
                            <a href={print({ query: { date } }).url}>
                                <Printer /> Cause list
                            </a>
                        </Button>
                    }
                />

                <Card>
                    <CardContent className="flex flex-wrap items-center justify-between gap-3 py-3">
                        <div className="flex items-center gap-2">
                            <Button variant="ghost" size="icon-sm" onClick={() => shift(-1)}>
                                <ChevronLeft />
                            </Button>
                            <span className="flex items-center gap-2 text-sm font-medium text-foreground">
                                <CalendarDays className="size-4 text-muted-foreground" />
                                {date}
                            </span>
                            <Button variant="ghost" size="icon-sm" onClick={() => shift(1)}>
                                <ChevronRight />
                            </Button>
                        </div>
                        <Select value={view} onValueChange={setView}>
                            <SelectTrigger className="w-32"><SelectValue /></SelectTrigger>
                            <SelectContent>
                                <SelectItem value="day">Day</SelectItem>
                                <SelectItem value="week">Week</SelectItem>
                            </SelectContent>
                        </Select>
                    </CardContent>
                </Card>

                {hearings.length === 0 ? (
                    <Card>
                        <CardContent className="p-0">
                            <EmptyState icon={CalendarDays} title="No hearings in this period" description="Nothing on the roster for the selected day or week." />
                        </CardContent>
                    </Card>
                ) : (
                    Object.entries(byCourt).map(([court, list]) => (
                        <Card key={court}>
                            <CardHeader>
                                <CardTitle className="text-base">{court}</CardTitle>
                            </CardHeader>
                            <CardContent className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
                                {list.map((h) => (
                                    <div key={h.id} className="rounded-lg border border-border p-3">
                                        <div className="flex items-center justify-between">
                                            <Link href={`/matters/${h.matter_id}`} className="font-mono text-xs text-muted-foreground hover:text-primary">
                                                {h.matter_number}
                                            </Link>
                                            <span className="text-xs text-muted-foreground">
                                                {h.date}
                                                {h.time ? ` ${h.time}` : ''}
                                            </span>
                                        </div>
                                        <p className="mt-1 text-sm font-medium text-foreground">{h.matter_title}</p>
                                        <p className="text-xs text-muted-foreground">{h.type}</p>
                                        <div className="mt-2 space-y-1">
                                            {h.attendees.length === 0 && (
                                                <p className="text-xs text-brand-warning">No one assigned</p>
                                            )}
                                            {h.attendees.map((a) => (
                                                <div key={a.id} className="flex items-center justify-between gap-2 text-sm">
                                                    <span className="text-foreground">
                                                        {a.name} <span className="text-xs text-muted-foreground">({a.role})</span>
                                                    </span>
                                                    {canConfirm ? (
                                                        <Select value={a.status} onValueChange={(v) => setStatus(a.id, v)}>
                                                            <SelectTrigger className="h-6 w-28 text-xs"><SelectValue /></SelectTrigger>
                                                            <SelectContent>
                                                                {attendanceStatuses.map((s) => (
                                                                    <SelectItem key={s.value} value={String(s.value)}>{s.label}</SelectItem>
                                                                ))}
                                                            </SelectContent>
                                                        </Select>
                                                    ) : (
                                                        <StatusBadge tone={a.status_tone}>{a.status_label}</StatusBadge>
                                                    )}
                                                </div>
                                            ))}
                                        </div>
                                        {canManage && <AssignForm hearingId={h.id} roles={roles} users={users} />}
                                    </div>
                                ))}
                            </CardContent>
                        </Card>
                    ))
                )}
            </div>
        </>
    );
}
