"use server";

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

const chambreSchema = z.object({
  numero: z.string().min(1, "Numéro requis"),
  type: z.enum(["SIMPLE", "DOUBLE", "SUITE", "FAMILIALE"]),
  prix_nuit: z.coerce.number().min(0, "Prix invalide"),
  capacite: z.coerce.number().min(1).max(20),
  description: z.string().optional().default(""),
  statut: z.enum(["DISPONIBLE", "OCCUPEE", "NETTOYAGE", "MAINTENANCE"]),
  equipements: z.string().optional().default("[]"),
  photos: z.string().optional().default("[]"),
});

export async function createChambre(formData: FormData) {
  const session = await auth();
  if (!session || !["ADMIN", "MANAGER"].includes(session.user.role)) {
    return { error: "Accès refusé" };
  }

  const raw = Object.fromEntries(formData.entries());
  const parsed = chambreSchema.safeParse(raw);
  if (!parsed.success) {
    return { error: parsed.error.issues[0].message };
  }

  // Vérification unicité du numéro
  const existing = await prisma.chambre.findUnique({
    where: { numero: parsed.data.numero },
  });
  if (existing) {
    return { error: `La chambre n°${parsed.data.numero} existe déjà` };
  }

  await prisma.chambre.create({ data: parsed.data });

  revalidatePath("/chambres");
  redirect("/chambres");
}

export async function updateChambre(id: string, formData: FormData) {
  const session = await auth();
  if (!session || !["ADMIN", "MANAGER"].includes(session.user.role)) {
    return { error: "Accès refusé" };
  }

  const raw = Object.fromEntries(formData.entries());
  const parsed = chambreSchema.safeParse(raw);
  if (!parsed.success) {
    return { error: parsed.error.issues[0].message };
  }

  // Si on change le numéro, vérifier l'unicité
  const existing = await prisma.chambre.findFirst({
    where: { numero: parsed.data.numero, NOT: { id } },
  });
  if (existing) {
    return { error: `La chambre n°${parsed.data.numero} existe déjà` };
  }

  await prisma.chambre.update({ where: { id }, data: parsed.data });

  revalidatePath("/chambres");
  revalidatePath(`/chambres/${id}`);
  redirect(`/chambres/${id}`);
}

export async function deleteChambre(id: string) {
  const session = await auth();
  if (!session || !["ADMIN", "MANAGER"].includes(session.user.role)) {
    return { error: "Accès refusé" };
  }

  // Vérifier qu'il n'y a pas de réservations actives ou passées
  const reservationsCount = await prisma.reservation.count({
    where: { chambre_id: id, statut: { in: ["CONFIRMEE", "EN_ATTENTE"] } },
  });
  if (reservationsCount > 0) {
    return { error: "Cette chambre a des réservations actives. Annulez-les d'abord." };
  }

  await prisma.chambre.delete({ where: { id } });
  revalidatePath("/chambres");
  return { success: true };
}

export async function updateChambreStatut(id: string, statut: string) {
  const session = await auth();
  if (!session || !["ADMIN", "MANAGER"].includes(session.user.role)) {
    return { error: "Accès refusé" };
  }

  await prisma.chambre.update({ where: { id }, data: { statut } });
  revalidatePath("/chambres");
  return { success: true };
}
