"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 createFacture(reservationId: string, remise: number = 0) {
  const session = await auth();
  if (!session || !["ADMIN", "MANAGER"].includes(session.user.role)) {
    return { error: "Accès refusé" };
  }

  const reservation = await prisma.reservation.findUnique({
    where: { id: reservationId },
    include: { factures: true },
  });
  if (!reservation) return { error: "Réservation introuvable" };
  if (reservation.factures.length > 0) {
    return { error: "Une facture existe déjà pour cette réservation" };
  }

  const hotel = await prisma.hotel.findFirst();
  const tauxTaxe = hotel?.taux_taxe || 10;
  const sousTotal = reservation.prix_total - remise;
  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,
      total,
      created_by: session.user.id,
    },
  });

  revalidatePath("/factures");
  revalidatePath(`/reservations/${reservationId}`);
  redirect(`/factures/${facture.id}`);
}

export async function deleteFacture(id: string) {
  const session = await auth();
  if (!session || session.user.role !== "ADMIN") {
    return { error: "Accès refusé" };
  }
  const facture = await prisma.facture.findUnique({ where: { id } });
  if (!facture) return { error: "Facture introuvable" };

  await prisma.facture.delete({ where: { id } });
  revalidatePath("/factures");
  revalidatePath(`/reservations/${facture.reservation_id}`);
  return { success: true };
}
