"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { writeFile, mkdir } from "fs/promises";
import path from "path";
import crypto from "crypto";
import { prisma } from "@/lib/prisma";
import { requirePermission } from "@/lib/permissions";
import { isValidPhone } from "@/lib/phone";
import { isValidEmail } from "@/lib/customer-otp";

const BASE = "/iv-manage-84x2/custom-orders";
const VALID_TYPES = ["name_engraving", "laser_engraving", "3d_printing"];
const ALLOWED_IMAGE_TYPES: Record<string, string> = {
  "image/jpeg": "jpg",
  "image/png": "png",
  "image/webp": "webp",
  "image/gif": "gif",
};
const MAX_IMAGE_SIZE = 5 * 1024 * 1024;

function revalidateAll() {
  revalidatePath(BASE);
  revalidatePath(`${BASE}/name-engraving`);
  revalidatePath(`${BASE}/laser-engraving`);
  revalidatePath(`${BASE}/3d-printing`);
  revalidatePath(`${BASE}/images`);
  revalidatePath(`${BASE}/design-approval`);
  revalidatePath(`${BASE}/production`);
  revalidatePath(`${BASE}/ready-to-dispatch`);
}

export async function createCustomOrderRequest(formData: FormData) {
  await requirePermission("custom_orders", "add");
  const customerName = String(formData.get("customerName") ?? "").trim();
  const email = String(formData.get("email") ?? "").trim().toLowerCase();
  const phone = String(formData.get("phone") ?? "").trim();
  const type = String(formData.get("type") ?? "");
  const quantityRaw = String(formData.get("quantity") ?? "").trim();
  const quantity = quantityRaw ? Math.max(1, Math.round(Number(quantityRaw))) : null;
  const details = String(formData.get("details") ?? "").trim();

  if (!customerName || !phone || !VALID_TYPES.includes(type) || !details) {
    redirect(`${BASE}?error=Fill+in+customer+name%2C+phone%2C+type%2C+and+details`);
  }
  if (!isValidPhone(phone)) redirect(`${BASE}?error=Enter+a+valid+10-digit+mobile+number`);
  if (email && !isValidEmail(email)) redirect(`${BASE}?error=Enter+a+valid+email+address`);

  let referenceImage: string | null = null;
  const file = formData.get("image");
  if (file instanceof File && file.size > 0) {
    const ext = ALLOWED_IMAGE_TYPES[file.type];
    if (!ext) redirect(`${BASE}?error=Only+JPG%2C+PNG%2C+WEBP%2C+or+GIF+images+are+allowed`);
    if (file.size > MAX_IMAGE_SIZE) redirect(`${BASE}?error=Image+must+be+under+5MB`);

    const uploadDir = path.join(process.cwd(), "public", "uploads", "custom-orders");
    await mkdir(uploadDir, { recursive: true });
    const filename = `${crypto.randomUUID()}.${ext}`;
    const bytes = Buffer.from(await file.arrayBuffer());
    await writeFile(path.join(uploadDir, filename), bytes);
    referenceImage = `/uploads/custom-orders/${filename}`;
  }

  await prisma.customOrderRequest.create({
    data: { customerName, email, phone, type, quantity, details, referenceImage },
  });

  revalidateAll();
  redirect(`${BASE}?success=Custom+order+request+added.`);
}

function withSuccess(returnTo: string, message: string): string {
  return `${returnTo}${returnTo.includes("?") ? "&" : "?"}success=${message}`;
}

export async function advanceCustomOrderStatus(id: string, newStatus: string, returnTo: string) {
  await requirePermission("custom_orders", "edit");
  await prisma.customOrderRequest.update({ where: { id }, data: { status: newStatus } });
  revalidateAll();
  redirect(withSuccess(returnTo, "Status+updated."));
}

export async function cancelCustomOrderRequest(id: string, returnTo: string) {
  await requirePermission("custom_orders", "edit");
  await prisma.customOrderRequest.update({ where: { id }, data: { status: "cancelled" } });
  revalidateAll();
  redirect(withSuccess(returnTo, "Request+cancelled."));
}

export async function updateCustomOrderNotes(id: string, formData: FormData) {
  await requirePermission("custom_orders", "edit");
  const adminNotes = String(formData.get("adminNotes") ?? "").trim() || null;
  await prisma.customOrderRequest.update({ where: { id }, data: { adminNotes } });
  revalidateAll();
  redirect(`${BASE}?success=Notes+saved.`);
}

export async function uploadDesignProof(id: string, formData: FormData) {
  await requirePermission("custom_orders", "edit");
  const file = formData.get("image");
  if (!(file instanceof File) || file.size === 0) redirect(`${BASE}/design-approval?error=Pick+an+image`);

  const ext = ALLOWED_IMAGE_TYPES[file.type];
  if (!ext) redirect(`${BASE}/design-approval?error=Only+JPG%2C+PNG%2C+WEBP%2C+or+GIF+images+are+allowed`);
  if (file.size > MAX_IMAGE_SIZE) redirect(`${BASE}/design-approval?error=Image+must+be+under+5MB`);

  const uploadDir = path.join(process.cwd(), "public", "uploads", "custom-orders");
  await mkdir(uploadDir, { recursive: true });
  const filename = `${crypto.randomUUID()}.${ext}`;
  const bytes = Buffer.from(await file.arrayBuffer());
  await writeFile(path.join(uploadDir, filename), bytes);

  await prisma.customOrderRequest.update({
    where: { id },
    data: { designProofImage: `/uploads/custom-orders/${filename}`, customerFeedback: null },
  });
  revalidateAll();
  redirect(`${BASE}/design-approval?success=Design+proof+uploaded.`);
}
