import { Head, Link, router } from '@inertiajs/react';
import {
    ArrowLeft,
    Calendar,
    CheckCircle2,
    Columns3,
    CheckSquare,
    Circle,
    Pencil,
    Ticket,
    Trash2,
    Users,
} from 'lucide-react';
import ProjectController from '@/actions/App/Http/Controllers/Admin/ProjectController';
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 {
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
} from '@/components/ui/table';
import { useCan } from '@/hooks/use-can';
import { cn, formatCurrency, formatDate } from '@/lib/utils';
import { dashboard } from '@/routes';
import { edit, index, kanban } from '@/routes/admin/projects';
import { index as tasksIndex } from '@/routes/admin/tasks';
import { index as ticketsIndex } from '@/routes/admin/tickets';

type Milestone = {
    id: number;
    title: string;
    due_date: string | null;
    is_completed: boolean;
    sort_order: number;
};

type ProjectDetail = {
    id: number;
    code: string;
    name: string;
    description: string | null;
    status: string;
    status_label: string;
    is_active: boolean;
    customer: { id: number; code: string; name: string } | null;
    start_date: string;
    end_date: string;
    budget: string | number;
    progress_percent: number;
    team_members: { id: number; name: string }[];
    milestones: Milestone[];
};

function statusVariant(
    status: string,
): 'secondary' | 'outline' | 'destructive' {
    if (status === 'completed') {
        return 'secondary';
    }

    if (status === 'cancelled') {
        return 'destructive';
    }

    return 'outline';
}

export default function ProjectsShow({ project }: { project: ProjectDetail }) {
    const canUpdate = useCan('projects.update');
    const canDelete = useCan('projects.delete');
    const canViewTickets = useCan('tickets.view');
    const canViewTasks = useCan('tasks.view');
    const canViewKanban = canViewTasks || canViewTickets;
    const completedMilestones = project.milestones.filter(
        (milestone) => milestone.is_completed,
    ).length;

    return (
        <>
            <Head title={project.name} />

            <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">
                                {project.name}
                            </h1>
                            <Badge variant={statusVariant(project.status)}>
                                {project.status_label}
                            </Badge>
                            {!project.is_active && (
                                <Badge variant="outline">Inactif</Badge>
                            )}
                        </div>
                        <p className="text-muted-foreground font-mono text-sm">
                            {project.code}
                        </p>
                    </div>

                    <div className="flex flex-wrap gap-2">
                        {canViewKanban && (
                            <Button variant="outline" asChild>
                                <Link
                                    href={kanban.url({
                                        query: { project_id: project.id },
                                    })}
                                >
                                    <Columns3 />
                                    Kanban
                                </Link>
                            </Button>
                        )}
                        {canViewTickets && (
                            <Button variant="outline" asChild>
                                <Link
                                    href={ticketsIndex.url({
                                        query: { project_id: project.id },
                                    })}
                                >
                                    <Ticket />
                                    Tickets du projet
                                </Link>
                            </Button>
                        )}
                        {canViewTasks && (
                            <Button variant="outline" asChild>
                                <Link
                                    href={tasksIndex.url({
                                        query: { project_id: project.id },
                                    })}
                                >
                                    <CheckSquare />
                                    Tâches du projet
                                </Link>
                            </Button>
                        )}
                        {canUpdate && (
                            <Button variant="outline" asChild>
                                <Link href={edit(project.id)}>
                                    <Pencil />
                                    Modifier
                                </Link>
                            </Button>
                        )}
                        {canDelete && (
                            <ConfirmDialog
                                trigger={
                                    <Button variant="destructive">
                                        <Trash2 />
                                        Supprimer
                                    </Button>
                                }
                                title={`Supprimer le projet ${project.name} ?`}
                                description="Cette action est irréversible."
                                confirmLabel="Supprimer"
                                onConfirm={() => {
                                    router.delete(
                                        ProjectController.destroy.url(
                                            project.id,
                                        ),
                                    );
                                }}
                            />
                        )}
                        <Button variant="outline" asChild>
                            <Link href={index.url()}>
                                <ArrowLeft />
                                Retour
                            </Link>
                        </Button>
                    </div>
                </div>

                <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Budget</CardDescription>
                            <CardTitle className="text-2xl tabular-nums">
                                {formatCurrency(project.budget)}
                            </CardTitle>
                        </CardHeader>
                    </Card>

                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Avancement</CardDescription>
                            <CardTitle className="text-2xl tabular-nums">
                                {project.progress_percent} %
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <div className="bg-muted h-2 overflow-hidden rounded-full">
                                <div
                                    className="bg-primary h-full transition-all"
                                    style={{
                                        width: `${project.progress_percent}%`,
                                    }}
                                />
                            </div>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Période</CardDescription>
                            <CardTitle className="flex items-center gap-2 text-base font-medium">
                                <Calendar className="text-muted-foreground size-4" />
                                {formatDate(project.start_date)} —{' '}
                                {formatDate(project.end_date)}
                            </CardTitle>
                        </CardHeader>
                    </Card>

                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Jalons</CardDescription>
                            <CardTitle className="text-2xl tabular-nums">
                                {completedMilestones}/{project.milestones.length}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                </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">
                                    Client
                                </p>
                                <p className="font-medium">
                                    {project.customer?.name ?? '—'}
                                </p>
                                {project.customer && (
                                    <p className="text-muted-foreground font-mono text-xs">
                                        {project.customer.code}
                                    </p>
                                )}
                            </div>

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

                    <Card>
                        <CardHeader>
                            <CardTitle className="flex items-center gap-2">
                                <Users className="size-4" />
                                Équipe assignée
                            </CardTitle>
                            <CardDescription>
                                {project.team_members.length === 0
                                    ? 'Aucun membre assigné'
                                    : `${project.team_members.length} membre${project.team_members.length > 1 ? 's' : ''}`}
                            </CardDescription>
                        </CardHeader>
                        <CardContent>
                            {project.team_members.length === 0 ? (
                                <p className="text-muted-foreground text-sm">
                                    —
                                </p>
                            ) : (
                                <ul className="flex flex-wrap gap-2">
                                    {project.team_members.map((member) => (
                                        <li key={member.id}>
                                            <Badge variant="secondary">
                                                {member.name}
                                            </Badge>
                                        </li>
                                    ))}
                                </ul>
                            )}
                        </CardContent>
                    </Card>
                </div>

                <Card>
                    <CardHeader>
                        <CardTitle>Jalons</CardTitle>
                        <CardDescription>
                            Suivi des étapes clés du projet
                        </CardDescription>
                    </CardHeader>
                    <CardContent>
                        {project.milestones.length === 0 ? (
                            <p className="text-muted-foreground text-sm">
                                Aucun jalon défini pour ce projet.
                            </p>
                        ) : (
                            <Table>
                                <TableHeader>
                                    <TableRow>
                                        <TableHead className="w-12">
                                            Statut
                                        </TableHead>
                                        <TableHead>Titre</TableHead>
                                        <TableHead>Échéance</TableHead>
                                    </TableRow>
                                </TableHeader>
                                <TableBody>
                                    {project.milestones.map((milestone) => (
                                        <TableRow key={milestone.id}>
                                            <TableCell>
                                                {milestone.is_completed ? (
                                                    <CheckCircle2
                                                        className="size-4 text-green-600"
                                                        aria-label="Terminé"
                                                    />
                                                ) : (
                                                    <Circle
                                                        className="text-muted-foreground size-4"
                                                        aria-label="En attente"
                                                    />
                                                )}
                                            </TableCell>
                                            <TableCell
                                                className={cn(
                                                    milestone.is_completed &&
                                                        'text-muted-foreground line-through',
                                                )}
                                            >
                                                {milestone.title}
                                            </TableCell>
                                            <TableCell className="text-muted-foreground">
                                                {milestone.due_date
                                                    ? formatDate(
                                                          milestone.due_date,
                                                      )
                                                    : '—'}
                                            </TableCell>
                                        </TableRow>
                                    ))}
                                </TableBody>
                            </Table>
                        )}
                    </CardContent>
                </Card>
            </div>
        </>
    );
}

ProjectsShow.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Projets classiques', href: index() },
        { title: 'Fiche projet', href: '#' },
    ],
};
