"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { prisma } from "@/lib/prisma";
import { auth } from "@/auth";
import { generateInvoiceNumber } from "@/lib/utils";

export async function checkIn(reservationId: string) {
  const session = await auth();
  if (!session) return { error: "Non authentifié" };

  const reservation = await prisma.reservation.findUnique({
    where: { id: reservationId },
    include: { chambre: true },
  });
  if (!reservation) return { error: "Réservation introuvable" };
  if (reservation.statut === "ANNULEE") return { error: "Réservation annulée" };
  if (reservation.statut === "TERMINEE") return { error: "Séjour déjà terminé" };
  if (reservation.chambre.statut === "OCCUPEE") {
    return { error: "La chambre est déjà occupée" };
  }

  await prisma.$transaction([
    prisma.chambre.update({
      where: { id: reservation.chambre_id },
      data: { statut: "OCCUPEE" },
    }),
    prisma.reservation.update({
      where: { id: reservationId },
      data: { statut: "CONFIRMEE" },
    }),
    prisma.operationLog.create({
      data: {
        type: "CHECKIN",
        reservation_id: reservationId,
        user_id: session.user.id,
        notes: `Check-in par ${session.user.name}`,
      },
    }),
  ]);

  revalidatePath("/checkin");
  revalidatePath("/chambres");
  revalidatePath(`/reservations/${reservationId}`);
  revalidatePath("/");
  return { success: true };
}

export async function checkOut(reservationId: string) {
  const session = await auth();
  if (!session) return { error: "Non authentifié" };

  const reservation = await prisma.reservation.findUnique({
    where: { id: reservationId },
    include: { chambre: true, factures: true },
  });
  if (!reservation) return { error: "Réservation introuvable" };

  // Génération facture si non existante
  let factureId: string | null = reservation.factures[0]?.id || null;
  if (!factureId) {
    const hotel = await prisma.hotel.findFirst();
    const tauxTaxe = hotel?.taux_taxe || 10;
    const sousTotal = reservation.prix_total;
    const montantTaxe = (sousTotal * tauxTaxe) / 100;
    const total = sousTotal + montantTaxe;

    const factureCount = await prisma.facture.count();
    const numero = generateInvoiceNumber(factureCount);

    const facture = await prisma.facture.create({
      data: {
        numero_facture: numero,
        reservation_id: reservationId,
        sous_total: sousTotal,
        montant_taxe: montantTaxe,
        remise: 0,
        total,
        created_by: session.user.id,
      },
    });
    factureId = facture.id;
  }

  await prisma.$transaction([
    prisma.chambre.update({
      where: { id: reservation.chambre_id },
      data: { statut: "NETTOYAGE" },
    }),
    prisma.reservation.update({
      where: { id: reservationId },
      data: { statut: "TERMINEE" },
    }),
    prisma.operationLog.create({
      data: {
        type: "CHECKOUT",
        reservation_id: reservationId,
        user_id: session.user.id,
        notes: `Check-out par ${session.user.name}`,
      },
    }),
  ]);

  revalidatePath("/checkin");
  revalidatePath("/chambres");
  revalidatePath("/factures");
  revalidatePath(`/reservations/${reservationId}`);
  revalidatePath("/");
  redirect(`/factures/${factureId}`);
}
