"use server";

import { revalidatePath } from "next/cache";
import { currentAdmin } from "@/lib/auth";
import { prisma } from "@/lib/prisma";

const requestStatuses = new Set(["NEW", "IN_REVIEW", "CONTACTED", "RESOLVED", "CLOSED"]);
const paymentStatuses = new Set(["PENDING", "PAID", "FAILED", "REFUNDED"]);

async function requireAdmin() {
  const admin = await currentAdmin();
  if (!admin) throw new Error("Admin session required.");
}

export async function updateIraTrustApplication(id: string, form: FormData) {
  await requireAdmin();
  const status = String(form.get("status") || "NEW");
  if (!requestStatuses.has(status)) throw new Error("Invalid IRA application status.");

  await prisma.iraTrustApplication.update({
    where: { id },
    data: {
      status,
      adminNotes: String(form.get("adminNotes") || "") || null
    }
  });

  revalidatePath("/admin/ira-trust-applications");
  revalidatePath(`/admin/ira-trust-applications/${id}`);
}

export async function updateSellBackRequest(id: string, form: FormData) {
  await requireAdmin();
  const status = String(form.get("status") || "NEW");
  if (!requestStatuses.has(status)) throw new Error("Invalid sell-back status.");

  await prisma.sellBackRequest.update({
    where: { id },
    data: {
      status,
      adminNotes: String(form.get("adminNotes") || "") || null
    }
  });

  revalidatePath("/admin/sell-back-requests");
  revalidatePath(`/admin/sell-back-requests/${id}`);
}

export async function updateContactTicket(id: string, form: FormData) {
  await requireAdmin();
  const status = String(form.get("status") || "NEW");
  if (!requestStatuses.has(status)) throw new Error("Invalid contact ticket status.");

  await prisma.contactTicket.update({
    where: { id },
    data: { status }
  });

  revalidatePath("/admin/contact-tickets");
  revalidatePath(`/admin/contact-tickets/${id}`);
}

export async function updateServicePayment(id: string, form: FormData) {
  await requireAdmin();
  const paymentStatus = String(form.get("paymentStatus") || "PENDING");
  if (!paymentStatuses.has(paymentStatus)) throw new Error("Invalid service payment status.");

  await prisma.servicePayment.update({
    where: { id },
    data: { paymentStatus }
  });

  revalidatePath("/admin/service-payments");
  revalidatePath(`/admin/service-payments/${id}`);
}
