"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 paiementSchema = z.object({
  reservation_id: z.string().min(1, "Réservation requise"),
  montant: z.coerce.number().min(0.01, "Montant invalide"),
  methode: z.enum(["ESPECES", "CARTE", "VIREMENT", "MOBILE_MONEY"]),
  date_paiement: z.string().min(1, "Date requise"),
  notes: z.string().optional().default(""),
});

export async function createPaiement(formData: FormData) {
  const session = await auth();
  if (!session) return { error: "Non authentifié" };

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

  await prisma.paiement.create({
    data: {
      reservation_id: parsed.data.reservation_id,
      montant: parsed.data.montant,
      methode: parsed.data.methode,
      date_paiement: new Date(parsed.data.date_paiement),
      notes: parsed.data.notes,
      created_by: session.user.id,
    },
  });

  revalidatePath("/paiements");
  revalidatePath(`/reservations/${parsed.data.reservation_id}`);
  revalidatePath("/");
  redirect(`/reservations/${parsed.data.reservation_id}`);
}

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

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