import { redirect } from "next/navigation";
import { prisma } from "@/lib/prisma";
import { auth } from "@/auth";
import { canAccess, PERMISSIONS } from "@/lib/utils";
import { PageHeader } from "@/components/ui/page-header";
import { RapportsView } from "@/components/modules/rapports/RapportsView";

export const dynamic = "force-dynamic";

interface PageProps {
  searchParams: { debut?: string; fin?: string };
}

export default async function RapportsPage({ searchParams }: PageProps) {
  const session = await auth();
  if (!canAccess(session?.user.role, PERMISSIONS.rapports_view)) redirect("/403");

  const today = new Date();
  const debutDefault = new Date();
  debutDefault.setMonth(debutDefault.getMonth() - 3);

  const debut = searchParams.debut ? new Date(searchParams.debut) : debutDefault;
  const fin = searchParams.fin ? new Date(searchParams.fin) : today;
  fin.setHours(23, 59, 59, 999);

  const [reservations, paiements, chambres, hotel] = await Promise.all([
    prisma.reservation.findMany({
      where: {
        OR: [
          { date_arrivee: { gte: debut, lte: fin } },
          { date_depart: { gte: debut, lte: fin } },
        ],
      },
      include: { client: true, chambre: true, paiements: true },
      orderBy: { date_arrivee: "desc" },
    }),
    prisma.paiement.findMany({
      where: { date_paiement: { gte: debut, lte: fin } },
      include: { reservation: { include: { chambre: true, client: true } } },
    }),
    prisma.chambre.findMany(),
    prisma.hotel.findFirst(),
  ]);

  // Données sérialisables (Dates -> strings)
  const reservationsData = reservations.map((r) => ({
    id: r.id,
    client: r.client.nom_complet,
    chambre: r.chambre.numero,
    type: r.chambre.type,
    date_arrivee: r.date_arrivee.toISOString(),
    date_depart: r.date_depart.toISOString(),
    nb_nuits: r.nb_nuits,
    nb_personnes: r.nb_personnes,
    prix_total: r.prix_total,
    statut: r.statut,
    paye: r.paiements.reduce((a, p) => a + p.montant, 0),
  }));

  const paiementsData = paiements.map((p) => ({
    id: p.id,
    date: p.date_paiement.toISOString(),
    montant: p.montant,
    methode: p.methode,
    client: p.reservation.client.nom_complet,
    chambre: p.reservation.chambre.numero,
  }));

  const chambresData = chambres.map((c) => ({
    id: c.id,
    numero: c.numero,
    type: c.type,
    prix_nuit: c.prix_nuit,
  }));

  return (
    <div className="space-y-4">
      <PageHeader
        title="Rapports"
        description="Analyses et statistiques de votre activité hôtelière"
      />
      <RapportsView
        reservations={reservationsData}
        paiements={paiementsData}
        chambres={chambresData}
        debut={debut.toISOString()}
        fin={fin.toISOString()}
        devise={hotel?.devise || "MAD"}
      />
    </div>
  );
}
