import { Head, Link, router } from '@inertiajs/react';
import { ArrowLeft, Pencil, Trash2 } from 'lucide-react';
import TicketController from '@/actions/App/Http/Controllers/Admin/TicketController';
import { ConfirmDialog } from '@/components/confirm-dialog';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { useCan } from '@/hooks/use-can';
import { formatDate } from '@/lib/utils';
import { dashboard } from '@/routes';
import { show as projectShow } from '@/routes/admin/projects';
import { index } from '@/routes/admin/tickets';
import { TicketCategoryBadge } from './category-badge';
import { TicketPriorityBadge } from './priority-badge';
import { TicketStatusBadge } from './status-badge';

type TicketDetail = {
    id: number;
    code: string;
    title: string;
    description: string | null;
    category: string;
    category_label: string;
    status: string;
    status_label: string;
    priority: string;
    priority_label: string;
    is_active: boolean;
    due_date: string | null;
    created_at: string | null;
    project: { id: number; code: string; name: string };
    assignee: { id: number; name: string } | null;
    creator: { id: number; name: string } | null;
    tasks: {
        id: number;
        code: string;
        title: string;
        status: string;
        status_label: string;
    }[];
};

export default function TicketsShow({ ticket }: { ticket: TicketDetail }) {
    const canUpdate = useCan('tickets.update');
    const canDelete = useCan('tickets.delete');

    return (
        <>
            <Head title={ticket.title} />

            <div className="flex h-full flex-1 flex-col gap-6 p-4 md:p-6">
                <div className="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
                    <div className="space-y-2">
                        <div className="flex flex-wrap items-center gap-2">
                            <h1 className="text-xl font-semibold tracking-tight">
                                {ticket.title}
                            </h1>
                            <TicketStatusBadge
                                status={ticket.status}
                                label={ticket.status_label}
                            />
                            <TicketPriorityBadge
                                priority={ticket.priority}
                                label={ticket.priority_label}
                            />
                            <TicketCategoryBadge
                                category={ticket.category}
                                label={ticket.category_label}
                            />
                            {!ticket.is_active && (
                                <Badge variant="outline">Inactif</Badge>
                            )}
                        </div>
                        <p className="text-muted-foreground font-mono text-sm">
                            {ticket.code}
                        </p>
                    </div>

                    <div className="flex flex-wrap gap-2">
                        {canDelete && (
                            <ConfirmDialog
                                trigger={
                                    <Button variant="destructive">
                                        <Trash2 />
                                        Supprimer
                                    </Button>
                                }
                                title={`Supprimer le ticket ${ticket.title} ?`}
                                description="Cette action est irréversible."
                                confirmLabel="Supprimer"
                                onConfirm={() => {
                                    router.delete(
                                        TicketController.destroy.url(
                                            ticket.id,
                                        ),
                                    );
                                }}
                            />
                        )}
                        <Button variant="outline" asChild>
                            <Link href={index.url()}>
                                <ArrowLeft />
                                Retour
                            </Link>
                        </Button>
                    </div>
                </div>

                <div className="grid gap-4 lg:grid-cols-2">
                    <Card>
                        <CardHeader>
                            <CardTitle>Informations</CardTitle>
                        </CardHeader>
                        <CardContent className="space-y-4 text-sm">
                            <div>
                                <p className="text-muted-foreground mb-1">
                                    Projet
                                </p>
                                <Link
                                    href={projectShow(ticket.project.id)}
                                    className="font-medium hover:underline"
                                >
                                    {ticket.project.code} —{' '}
                                    {ticket.project.name}
                                </Link>
                            </div>

                            <div>
                                <p className="text-muted-foreground mb-1">
                                    Assigné à
                                </p>
                                <p className="font-medium">
                                    {ticket.assignee?.name ?? '—'}
                                </p>
                            </div>

                            <div>
                                <p className="text-muted-foreground mb-1">
                                    Créé par
                                </p>
                                <p className="font-medium">
                                    {ticket.creator?.name ?? '—'}
                                </p>
                            </div>

                            <div>
                                <p className="text-muted-foreground mb-1">
                                    Échéance
                                </p>
                                <p className="font-medium">
                                    {ticket.due_date
                                        ? formatDate(ticket.due_date)
                                        : '—'}
                                </p>
                            </div>

                            {ticket.description && (
                                <div>
                                    <p className="text-muted-foreground mb-1">
                                        Description
                                    </p>
                                    <p className="whitespace-pre-wrap">
                                        {ticket.description}
                                    </p>
                                </div>
                            )}
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Tâches liées</CardTitle>
                            <CardDescription>
                                {ticket.tasks.length === 0
                                    ? 'Aucune tâche liée'
                                    : `${ticket.tasks.length} tâche${ticket.tasks.length > 1 ? 's' : ''}`}
                            </CardDescription>
                        </CardHeader>
                        <CardContent>
                            {ticket.tasks.length === 0 ? (
                                <p className="text-muted-foreground text-sm">
                                    —
                                </p>
                            ) : (
                                <ul className="space-y-2">
                                    {ticket.tasks.map((task) => (
                                        <li
                                            key={task.id}
                                            className="flex items-center justify-between rounded-md border p-3 text-sm"
                                        >
                                            <span>
                                                <span className="text-muted-foreground font-mono text-xs">
                                                    {task.code}
                                                </span>{' '}
                                                {task.title}
                                            </span>
                                            <Badge variant="outline">
                                                {task.status_label}
                                            </Badge>
                                        </li>
                                    ))}
                                </ul>
                            )}
                        </CardContent>
                    </Card>
                </div>
            </div>
        </>
    );
}

TicketsShow.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Tickets', href: index() },
        { title: 'Détail', href: '#' },
    ],
};
