"use server";

import { db } from "@/lib/db";
import { revalidatePath } from "next/cache";
import { mkdir, writeFile } from "node:fs/promises";
import path from "node:path";
import { randomUUID } from "node:crypto";

function slugify(value: string): string {
  return value
    .toLowerCase()
    .trim()
    .replace(/[^a-z0-9]+/g, "-")
    .replace(/(^-|-$)/g, "");
}

function normalizeImageUrl(value: string): string {
  const input = value.trim();
  if (!input) return "";
  if (input.startsWith("http://") || input.startsWith("https://") || input.startsWith("data:") || input.startsWith("blob:")) return input;
  if (input.startsWith("//")) return `https:${input}`;
  if (input.startsWith("/")) return input;
  return `/${input}`;
}

async function saveUpload(file: File): Promise<string> {
  if (!file || file.size === 0) throw new Error("No file uploaded");
  if (!file.type.startsWith("image/")) throw new Error("Only image uploads are allowed");

  const ext = path.extname(file.name || "").toLowerCase() || ".jpg";
  const safeExt = ext.replace(/[^.a-z0-9]/g, "") || ".jpg";
  const fileName = `${Date.now()}-${randomUUID()}${safeExt}`;
  const dir = path.join(process.cwd(), "public", "uploads", "ticket-slides");

  await mkdir(dir, { recursive: true });
  const bytes = Buffer.from(await file.arrayBuffer());
  await writeFile(path.join(dir, fileName), bytes);

  return `/uploads/ticket-slides/${fileName}`;
}

export async function saveTicketCountryAction(formData: FormData) {
  const id = String(formData.get("id") || "").trim();
  const name = String(formData.get("name") || "").trim();
  const slugRaw = String(formData.get("slug") || "").trim();
  const isActive = String(formData.get("isActive") || "true") === "true";

  if (!name) return { ok: false, error: "Country name is required" };
  const slug = slugRaw || slugify(name);

  if (id) {
    await db.ticketCountry.update({ where: { id }, data: { name, slug, isActive } });
  } else {
    await db.ticketCountry.create({ data: { name, slug, isActive } });
  }

  revalidatePath("/admin/tickets");
  revalidatePath("/tickets");
  return { ok: true };
}

export async function deleteTicketCountryAction(id: string) {
  try {
    await db.ticketCountry.delete({ where: { id } });
    revalidatePath("/admin/tickets");
    revalidatePath("/tickets");
    return { ok: true };
  } catch {
    return { ok: false, error: "Country is in use by cities or requests." };
  }
}

export async function saveTicketCityAction(formData: FormData) {
  const id = String(formData.get("id") || "").trim();
  const countryId = String(formData.get("countryId") || "").trim();
  const name = String(formData.get("name") || "").trim();
  const slugRaw = String(formData.get("slug") || "").trim();
  const isActive = String(formData.get("isActive") || "true") === "true";

  if (!countryId) return { ok: false, error: "Country is required" };
  if (!name) return { ok: false, error: "City name is required" };

  const slug = slugRaw || slugify(name);

  if (id) {
    await db.ticketCity.update({ where: { id }, data: { countryId, name, slug, isActive } });
  } else {
    await db.ticketCity.create({ data: { countryId, name, slug, isActive } });
  }

  revalidatePath("/admin/tickets");
  revalidatePath("/tickets");
  return { ok: true };
}

export async function deleteTicketCityAction(id: string) {
  try {
    await db.ticketCity.delete({ where: { id } });
    revalidatePath("/admin/tickets");
    revalidatePath("/tickets");
    return { ok: true };
  } catch {
    return { ok: false, error: "City is in use by ticket requests." };
  }
}

export async function saveTicketSlideAction(formData: FormData) {
  const id = String(formData.get("id") || "").trim();
  const imageUrlRaw = String(formData.get("imageUrl") || "").trim();
  const imageFile = formData.get("imageFile") as File | null;
  const title = String(formData.get("title") || "").trim() || null;
  const subtitle = String(formData.get("subtitle") || "").trim() || null;
  const ctaText = String(formData.get("ctaText") || "").trim() || null;
  const ctaLink = String(formData.get("ctaLink") || "").trim() || null;
  const sortOrder = Number(formData.get("sortOrder") || 0) || 0;
  const isActive = String(formData.get("isActive") || "true") === "true";

  const uploaded = imageFile && imageFile.size > 0 ? await saveUpload(imageFile) : "";
  const imageUrl = normalizeImageUrl(uploaded || imageUrlRaw);
  if (!imageUrl) return { ok: false, error: "Provide image URL or upload an image." };

  const data = { imageUrl, title, subtitle, ctaText, ctaLink, sortOrder, isActive };

  if (id) {
    await db.ticketSlide.update({ where: { id }, data });
  } else {
    await db.ticketSlide.create({ data });
  }

  revalidatePath("/admin/tickets");
  revalidatePath("/tickets");
  return { ok: true };
}

export async function deleteTicketSlideAction(id: string) {
  await db.ticketSlide.delete({ where: { id } });
  revalidatePath("/admin/tickets");
  revalidatePath("/tickets");
  return { ok: true };
}

export async function updateTicketRequestStatusAction(id: string, status: "new" | "in_progress" | "resolved") {
  await db.ticketRequest.update({ where: { id }, data: { status } });
  revalidatePath("/admin/tickets");
  return { ok: true };
}

export async function deleteTicketRequestAction(id: string) {
  await db.ticketRequest.delete({ where: { id } });
  revalidatePath("/admin/tickets");
  return { ok: true };
}
