import { prisma } from "@/lib/prisma";
import { formatMoney, formatDate, TYPE_CHAMBRE_LABELS } from "@/lib/utils";
import { Card, CardContent } from "@/components/ui/card";
import { PageHeader } from "@/components/ui/page-header";
import { EmptyState } from "@/components/ui/empty-state";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table";
import { CheckInButton } from "@/components/modules/checkin/CheckInButton";
import { CheckOutButton } from "@/components/modules/checkin/CheckOutButton";
import { LogIn, LogOut } from "lucide-react";
import Link from "next/link";

export const dynamic = "force-dynamic";

export default async function CheckInPage() {
  const today = new Date();
  today.setHours(23, 59, 59, 999);

  // Check-in : réservations dont l'arrivée est aujourd'hui ou passée, chambre encore disponible
  const arrivees = await prisma.reservation.findMany({
    where: {
      statut: { in: ["CONFIRMEE", "EN_ATTENTE"] },
      date_arrivee: { lte: today },
      chambre: { statut: { not: "OCCUPEE" } },
    },
    include: { client: true, chambre: true },
    orderBy: { date_arrivee: "asc" },
  });

  // Check-out : réservations dont la chambre est OCCUPEE
  const departs = await prisma.reservation.findMany({
    where: {
      statut: { in: ["CONFIRMEE"] },
      chambre: { statut: "OCCUPEE" },
    },
    include: { client: true, chambre: true, paiements: true },
    orderBy: { date_depart: "asc" },
  });

  const hotel = await prisma.hotel.findFirst();
  const devise = hotel?.devise || "MAD";

  return (
    <div className="space-y-4">
      <PageHeader
        title="Check-in / Check-out"
        description="Gérez les arrivées et les départs de vos clients"
      />

      <Tabs defaultValue="checkin">
        <TabsList>
          <TabsTrigger value="checkin" className="gap-2">
            <LogIn className="w-4 h-4" />
            Arrivées ({arrivees.length})
          </TabsTrigger>
          <TabsTrigger value="checkout" className="gap-2">
            <LogOut className="w-4 h-4" />
            Départs ({departs.length})
          </TabsTrigger>
        </TabsList>

        <TabsContent value="checkin">
          {arrivees.length === 0 ? (
            <EmptyState
              icon={<LogIn className="w-8 h-8" />}
              title="Aucune arrivée en attente"
              description="Toutes les arrivées prévues ont été traitées."
            />
          ) : (
            <Card>
              <CardContent className="p-0">
                <Table>
                  <TableHeader>
                    <TableRow>
                      <TableHead>Client</TableHead>
                      <TableHead>Chambre</TableHead>
                      <TableHead>Arrivée prévue</TableHead>
                      <TableHead>Départ prévu</TableHead>
                      <TableHead>Personnes</TableHead>
                      <TableHead className="text-right">Total</TableHead>
                      <TableHead className="text-right">Action</TableHead>
                    </TableRow>
                  </TableHeader>
                  <TableBody>
                    {arrivees.map((r) => (
                      <TableRow key={r.id}>
                        <TableCell>
                          <Link
                            href={`/reservations/${r.id}`}
                            className="font-medium hover:underline"
                          >
                            {r.client.nom_complet}
                          </Link>
                        </TableCell>
                        <TableCell>
                          N°{r.chambre.numero} ({TYPE_CHAMBRE_LABELS[r.chambre.type]})
                        </TableCell>
                        <TableCell>{formatDate(r.date_arrivee)}</TableCell>
                        <TableCell>{formatDate(r.date_depart)}</TableCell>
                        <TableCell>{r.nb_personnes}</TableCell>
                        <TableCell className="text-right">
                          {formatMoney(r.prix_total, devise)}
                        </TableCell>
                        <TableCell className="text-right">
                          <CheckInButton id={r.id} client={r.client.nom_complet} />
                        </TableCell>
                      </TableRow>
                    ))}
                  </TableBody>
                </Table>
              </CardContent>
            </Card>
          )}
        </TabsContent>

        <TabsContent value="checkout">
          {departs.length === 0 ? (
            <EmptyState
              icon={<LogOut className="w-8 h-8" />}
              title="Aucun départ à traiter"
              description="Aucun client n'est actuellement enregistré dans une chambre."
            />
          ) : (
            <Card>
              <CardContent className="p-0">
                <Table>
                  <TableHeader>
                    <TableRow>
                      <TableHead>Client</TableHead>
                      <TableHead>Chambre</TableHead>
                      <TableHead>Arrivée</TableHead>
                      <TableHead>Départ prévu</TableHead>
                      <TableHead>Solde</TableHead>
                      <TableHead className="text-right">Action</TableHead>
                    </TableRow>
                  </TableHeader>
                  <TableBody>
                    {departs.map((r) => {
                      const paye = r.paiements.reduce((a, p) => a + p.montant, 0);
                      const solde = r.prix_total - paye;
                      return (
                        <TableRow key={r.id}>
                          <TableCell>
                            <Link
                              href={`/reservations/${r.id}`}
                              className="font-medium hover:underline"
                            >
                              {r.client.nom_complet}
                            </Link>
                          </TableCell>
                          <TableCell>N°{r.chambre.numero}</TableCell>
                          <TableCell>{formatDate(r.date_arrivee)}</TableCell>
                          <TableCell>{formatDate(r.date_depart)}</TableCell>
                          <TableCell>
                            <span
                              className={
                                solde > 0 ? "text-danger font-semibold" : "text-success font-semibold"
                              }
                            >
                              {formatMoney(solde, devise)}
                            </span>
                          </TableCell>
                          <TableCell className="text-right">
                            <CheckOutButton id={r.id} client={r.client.nom_complet} solde={solde} devise={devise} />
                          </TableCell>
                        </TableRow>
                      );
                    })}
                  </TableBody>
                </Table>
              </CardContent>
            </Card>
          )}
        </TabsContent>
      </Tabs>
    </div>
  );
}
