import { Head, Link, router, useForm } from '@inertiajs/react';
import { ArrowLeft, Trash2 } from 'lucide-react';
import { ConfirmDialog } from '@/components/confirm-dialog';
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 { Textarea } from '@/components/ui/textarea';
import { show as matterShow } from '@/routes/matters';
import { destroy, index, reopen } from '@/routes/tasks';
import { store as commentStore } from '@/routes/tasks/comments';
import { update as statusUpdate } from '@/routes/tasks/status';

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

type Task = {
    id: string;
    title: string;
    description: string | null;
    status: string;
    status_label: string;
    status_tone: StatusTone;
    priority_label: string;
    priority_tone: StatusTone;
    due_date: string | null;
    overdue: boolean;
    assignee: string | null;
    assigned_by: string | null;
    completed_at: string | null;
    created_at: string | null;
    matter: { id: string; number: string; title: string } | null;
    comments: { id: number; user: string | null; comment: string; at: string | null }[];
};

type Props = {
    task: Task;
    can: { edit: boolean; delete: boolean };
    options: { statuses: Option[]; priorities: Option[] };
};

export default function TaskShow({ task, can, options }: Props) {
    const commentForm = useForm({ comment: '' });
    const terminal = task.status === 'done' || task.status === 'cancelled';

    const addComment = (e: React.FormEvent) => {
        e.preventDefault();
        commentForm.post(commentStore(task.id).url, { preserveScroll: true, onSuccess: () => commentForm.reset() });
    };

    return (
        <>
            <Head title={task.title} />
            <div className="flex flex-col gap-6 p-4">
                <PageHeader
                    title={task.title}
                    subtitle={task.matter ? `${task.matter.number} · ${task.matter.title}` : 'General task'}
                    action={
                        <div className="flex flex-wrap gap-2">
                            <Button asChild variant="outline">
                                <Link href={index()}><ArrowLeft /> Back</Link>
                            </Button>
                            {can.delete && (
                                <ConfirmDialog
                                    title="Delete this task?"
                                    description="This task will be removed. This cannot be undone."
                                    confirmLabel="Delete task"
                                    onConfirm={() => router.delete(destroy(task.id).url)}
                                    trigger={<Button variant="destructive"><Trash2 /> Delete</Button>}
                                />
                            )}
                        </div>
                    }
                />

                <div className="flex flex-wrap items-center gap-2">
                    <StatusBadge tone={task.status_tone}>{task.status_label}</StatusBadge>
                    <StatusBadge tone={task.priority_tone}>{task.priority_label} priority</StatusBadge>
                    {task.overdue && <StatusBadge tone="danger">Overdue</StatusBadge>}
                </div>

                <div className="grid gap-6 lg:grid-cols-3">
                    <Card className="lg:col-span-2">
                        <CardHeader><CardTitle>Details</CardTitle></CardHeader>
                        <CardContent className="space-y-3 text-sm">
                            <p className="text-foreground">{task.description || 'No description.'}</p>
                            <dl className="grid grid-cols-2 gap-3 pt-2">
                                <div>
                                    <dt className="text-xs text-muted-foreground uppercase">Assignee</dt>
                                    <dd className="text-foreground">{task.assignee ?? 'Unassigned'}</dd>
                                </div>
                                <div>
                                    <dt className="text-xs text-muted-foreground uppercase">Assigned by</dt>
                                    <dd className="text-foreground">{task.assigned_by ?? '—'}</dd>
                                </div>
                                <div>
                                    <dt className="text-xs text-muted-foreground uppercase">Due date</dt>
                                    <dd className="text-foreground">{task.due_date ?? '—'}</dd>
                                </div>
                                <div>
                                    <dt className="text-xs text-muted-foreground uppercase">Completed</dt>
                                    <dd className="text-foreground">{task.completed_at ?? '—'}</dd>
                                </div>
                                {task.matter && (
                                    <div>
                                        <dt className="text-xs text-muted-foreground uppercase">Matter</dt>
                                        <dd>
                                            <Link href={matterShow(task.matter.id)} className="text-primary hover:underline">
                                                {task.matter.number}
                                            </Link>
                                        </dd>
                                    </div>
                                )}
                            </dl>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader><CardTitle>Status</CardTitle></CardHeader>
                        <CardContent className="space-y-3">
                            {can.edit && !terminal && (
                                <Select value={task.status} onValueChange={(v) => router.patch(statusUpdate(task.id).url, { status: v }, { preserveScroll: true })}>
                                    <SelectTrigger><SelectValue /></SelectTrigger>
                                    <SelectContent>
                                        {options.statuses.map((s) => (
                                            <SelectItem key={s.value} value={String(s.value)}>{s.label}</SelectItem>
                                        ))}
                                    </SelectContent>
                                </Select>
                            )}
                            {can.edit && terminal && (
                                <Button variant="secondary" onClick={() => router.post(reopen(task.id).url, {}, { preserveScroll: true })}>
                                    Reopen task
                                </Button>
                            )}
                            {!can.edit && <p className="text-sm text-muted-foreground">You can't change this task's status.</p>}
                        </CardContent>
                    </Card>
                </div>

                <Card>
                    <CardHeader><CardTitle>Comments</CardTitle></CardHeader>
                    <CardContent className="space-y-4">
                        {task.comments.length === 0 && <p className="text-sm text-muted-foreground">No comments yet.</p>}
                        {task.comments.map((c) => (
                            <div key={c.id} className="border-l-2 border-border pl-3">
                                <p className="text-xs text-muted-foreground">{c.user} · {c.at}</p>
                                <p className="text-sm text-foreground">{c.comment}</p>
                            </div>
                        ))}
                        <form onSubmit={addComment} className="space-y-2 border-t border-border pt-4">
                            <Textarea value={commentForm.data.comment} onChange={(e) => commentForm.setData('comment', e.target.value)} placeholder="Add a comment…" required />
                            <Button type="submit" disabled={commentForm.processing}>Post comment</Button>
                        </form>
                    </CardContent>
                </Card>
            </div>
        </>
    );
}
