import Link from "next/link";
import { prisma } from "@/lib/prisma";
import { auth } from "@/auth";
import {
  formatMoney,
  STATUT_CHAMBRE_LABELS,
  TYPE_CHAMBRE_LABELS,
  canAccess,
  PERMISSIONS,
} from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import { Badge, statutBadgeVariant } from "@/components/ui/badge";
import { PageHeader } from "@/components/ui/page-header";
import { EmptyState } from "@/components/ui/empty-state";
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table";
import { Plus, BedDouble, Pencil } from "lucide-react";
import { ChambreFilters } from "@/components/modules/chambres/ChambreFilters";
import { ChambreStatutSwitcher } from "@/components/modules/chambres/ChambreStatutSwitcher";

export const dynamic = "force-dynamic";

interface PageProps {
  searchParams: { statut?: string; type?: string };
}

export default async function ChambresPage({ searchParams }: PageProps) {
  const session = await auth();
  const canWrite = canAccess(session?.user.role, PERMISSIONS.chambres_write);

  const where: { statut?: string; type?: string } = {};
  if (searchParams.statut) where.statut = searchParams.statut;
  if (searchParams.type) where.type = searchParams.type;

  const [chambres, hotel] = await Promise.all([
    prisma.chambre.findMany({
      where,
      orderBy: { numero: "asc" },
    }),
    prisma.hotel.findFirst(),
  ]);

  const devise = hotel?.devise || "MAD";

  return (
    <div className="space-y-4">
      <PageHeader
        title="Chambres"
        description={`${chambres.length} chambre${chambres.length > 1 ? "s" : ""} affichée${chambres.length > 1 ? "s" : ""}`}
        action={
          canWrite && (
            <Button asChild variant="accent">
              <Link href="/chambres/nouvelle">
                <Plus className="w-4 h-4" />
                Nouvelle chambre
              </Link>
            </Button>
          )
        }
      />

      <ChambreFilters />

      {chambres.length === 0 ? (
        <EmptyState
          icon={<BedDouble className="w-8 h-8" />}
          title="Aucune chambre trouvée"
          description="Commencez par ajouter votre première chambre."
          actionLabel={canWrite ? "Ajouter une chambre" : undefined}
          actionHref={canWrite ? "/chambres/nouvelle" : undefined}
        />
      ) : (
        <Card>
          <CardContent className="p-0">
            <Table>
              <TableHeader>
                <TableRow>
                  <TableHead>N°</TableHead>
                  <TableHead>Type</TableHead>
                  <TableHead>Capacité</TableHead>
                  <TableHead>Prix / nuit</TableHead>
                  <TableHead>Statut</TableHead>
                  <TableHead className="text-right">Actions</TableHead>
                </TableRow>
              </TableHeader>
              <TableBody>
                {chambres.map((c) => (
                  <TableRow key={c.id}>
                    <TableCell className="font-semibold">{c.numero}</TableCell>
                    <TableCell>{TYPE_CHAMBRE_LABELS[c.type] || c.type}</TableCell>
                    <TableCell>{c.capacite} pers.</TableCell>
                    <TableCell>{formatMoney(c.prix_nuit, devise)}</TableCell>
                    <TableCell>
                      {canWrite ? (
                        <ChambreStatutSwitcher id={c.id} statut={c.statut} />
                      ) : (
                        <Badge variant={statutBadgeVariant(c.statut)}>
                          {STATUT_CHAMBRE_LABELS[c.statut]}
                        </Badge>
                      )}
                    </TableCell>
                    <TableCell className="text-right">
                      <Button asChild variant="ghost" size="sm">
                        <Link href={`/chambres/${c.id}`}>
                          <Pencil className="w-3.5 h-3.5" />
                          Détails
                        </Link>
                      </Button>
                    </TableCell>
                  </TableRow>
                ))}
              </TableBody>
            </Table>
          </CardContent>
        </Card>
      )}
    </div>
  );
}
