"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { db } from "@/lib/db";
import { requireSuperAdmin } from "@/lib/auth";
import { audit } from "@/lib/audit";
import { setSetting } from "@/lib/settings";
import { saveImage } from "@/lib/storage";

export async function adminSetConferenceStatus(confId: string, status: string, formData: FormData) {
  void formData;
  const user = await requireSuperAdmin();
  await db.conference.update({ where: { id: confId }, data: { status } });
  await audit({ userId: user.id, conferenceId: confId, action: `admin.conference.status.${status.toLowerCase()}` });
  revalidatePath("/admin/conferences");
}

/** Hard delete — any status. Cascades registrations, sessions, certificates, everything. */
export async function adminDeleteConference(confId: string, formData: FormData) {
  void formData;
  const user = await requireSuperAdmin();
  const conf = await db.conference.findUnique({ where: { id: confId }, select: { status: true, name: true } });
  if (!conf) return;
  await db.conference.delete({ where: { id: confId } });
  await audit({ userId: user.id, action: "admin.conference.delete", meta: { name: conf.name, status: conf.status } });
  revalidatePath("/admin/conferences");
}

export async function saveS3Settings(formData: FormData) {
  const user = await requireSuperAdmin();
  const bucket = String(formData.get("bucket") || "").trim();
  const secret = String(formData.get("secretAccessKey") || "").trim();

  await setSetting("s3.bucket", bucket);
  await setSetting("s3.region", String(formData.get("region") || "").trim());
  await setSetting("s3.accessKeyId", String(formData.get("accessKeyId") || "").trim());
  if (secret) await setSetting("s3.secretAccessKey", secret); // blank = keep existing
  if (!bucket) await setSetting("s3.secretAccessKey", ""); // clearing the bucket clears the secret too
  await setSetting("s3.publicUrl", String(formData.get("publicUrl") || "").trim());

  await audit({ userId: user.id, action: "admin.settings.s3", meta: { bucket: bucket || "(cleared)" } });
  revalidatePath("/admin/settings");
  redirect("/admin/settings?saved=1");
}

/** Uploads a tiny probe image through the active storage mode and reports the resulting URL. */
export async function testStorageAction() {
  await requireSuperAdmin();
  // 1×1 transparent PNG
  const pixel = Uint8Array.from(atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="), (c) => c.charCodeAt(0));
  try {
    const url = await saveImage(pixel, "image/png", "system-test");
    redirect(`/admin/settings?test=${encodeURIComponent(`ok:${url}`)}`);
  } catch (e) {
    if (e && typeof e === "object" && "digest" in e) throw e; // let the redirect through
    redirect(`/admin/settings?test=${encodeURIComponent(`fail:${(e as Error).message.slice(0, 200)}`)}`);
  }
}

export async function saveSesSettings(formData: FormData) {
  const user = await requireSuperAdmin();
  const fromEmail = String(formData.get("fromEmail") || "").trim();
  const secret = String(formData.get("sesSecretAccessKey") || "").trim();

  await setSetting("ses.fromEmail", fromEmail);
  await setSetting("ses.fromName", String(formData.get("fromName") || "").trim());
  await setSetting("ses.region", String(formData.get("sesRegion") || "").trim());
  await setSetting("ses.accessKeyId", String(formData.get("sesAccessKeyId") || "").trim());
  if (secret) await setSetting("ses.secretAccessKey", secret); // blank = keep existing
  if (!fromEmail) await setSetting("ses.secretAccessKey", ""); // clearing sender clears the secret
  await setSetting("platform.baseUrl", String(formData.get("baseUrl") || "").trim());

  await audit({ userId: user.id, action: "admin.settings.ses", meta: { fromEmail: fromEmail || "(cleared)" } });
  revalidatePath("/admin/settings");
  redirect("/admin/settings?saved=1");
}

/** Sends a real email through the active SES config to the admin's own address. */
export async function testEmailAction() {
  const user = await requireSuperAdmin();
  const { sendEmail } = await import("@/lib/email");
  const status = await sendEmail({
    to: user.email,
    subject: "Confexe SES test — it works 🎉",
    template: "ses_test",
    html: `<div style="font-family:sans-serif;padding:20px;"><h2>SES is configured correctly.</h2><p>This test email was sent from your Confexe System settings.</p></div>`,
  });
  const detail =
    status === "SENT" ? `ok:Delivered to ${user.email}` :
    status === "SKIPPED" ? "fail:SES is not configured — set a From address first." :
    `fail:${(await (await import("@/lib/db")).db.emailLog.findFirst({ where: { template: "ses_test" }, orderBy: { createdAt: "desc" } }))?.error ?? "send failed"}`;
  redirect(`/admin/settings?emailtest=${encodeURIComponent(detail)}`);
}
