"use server";

import { redirect } from "next/navigation";
import { revalidatePath } from "next/cache";
import { requireOrg, canConfigure, type Role } from "@/lib/ctx";
import { normalizePhone } from "@/lib/chat-parser";

const s = (fd: FormData, k: string) => String(fd.get(k) ?? "").trim();
const ROLES: Role[] = ["owner", "marketing", "cs_supervisor", "cs", "viewer"];

function back(e?: string): never {
  revalidatePath("/settings");
  redirect(e ? `/settings?e=${encodeURIComponent(e)}` : "/settings");
}

async function cfg() {
  const c = await requireOrg();
  if (!canConfigure(c.role)) redirect("/");
  return c;
}

async function ownerOnly() {
  const c = await requireOrg();
  if (c.role !== "owner") redirect("/settings");
  return c;
}

export async function saveMeta(fd: FormData) {
  const c = await cfg();
  const dataset = s(fd, "dataset_id");
  if (!dataset) back("Dataset ID (Pixel ID) wajib diisi.");
  await c.admin.from("meta_connections").upsert(
    {
      org_id: c.orgId,
      dataset_id: dataset,
      test_event_code: s(fd, "test_event_code") || null,
      currency: s(fd, "currency") || "IDR",
      backfill_missed_stages: fd.get("backfill") === "on",
      updated_at: new Date().toISOString(),
    },
    { onConflict: "org_id" }
  );
  const token = s(fd, "token");
  if (token) {
    const { error } = await c.admin.rpc("set_capi_token", { p_org: c.orgId, p_token: token });
    if (error) back("Gagal menyimpan token: " + error.message);
  }
  back();
}

export async function addRotator(fd: FormData) {
  const c = await cfg();
  const slug = s(fd, "slug").toLowerCase();
  if (!/^[a-z0-9-]{3,40}$/.test(slug)) back("Slug 3-40 karakter: huruf kecil, angka, tanda minus.");
  const { error } = await c.admin.from("rotators").insert({
    org_id: c.orgId,
    slug,
    name: s(fd, "name") || slug,
    prefilled_template: s(fd, "template") || "Halo, saya mau tanya produknya. Ref: {ref}",
  });
  if (error) back(error.code === "23505" ? "Slug sudah dipakai." : error.message);
  back();
}

export async function addNumber(fd: FormData) {
  const c = await cfg();
  const rid = s(fd, "rotator_id");
  const { data: r } = await c.admin.from("rotators").select("id").eq("id", rid).eq("org_id", c.orgId).maybeSingle();
  if (!r) back("Rotator tidak ditemukan.");
  const wa = normalizePhone(s(fd, "wa_number"));
  if (!wa) back("Nomor WA tidak valid.");
  await c.admin.from("cs_numbers").insert({
    org_id: c.orgId,
    rotator_id: rid,
    label: s(fd, "label") || wa,
    wa_number: wa,
    weight: Math.max(1, parseInt(s(fd, "weight") || "1", 10) || 1),
    user_id: s(fd, "user_id") || null,
  });
  back();
}

export async function toggleNumber(fd: FormData) {
  const c = await cfg();
  await c.admin.from("cs_numbers").update({ is_active: s(fd, "active") === "1" }).eq("id", s(fd, "id")).eq("org_id", c.orgId);
  back();
}

export async function addProduct(fd: FormData) {
  const c = await cfg();
  const name = s(fd, "name");
  if (!name) back("Nama produk wajib diisi.");
  const price = Number(s(fd, "price").replace(/[^\d.]/g, ""));
  await c.admin.from("products").insert({ org_id: c.orgId, name, sku: s(fd, "sku") || null, price: price > 0 ? price : null });
  back();
}

// Tanpa SMTP: owner membuat akun langsung dengan password awal
export async function addMember(fd: FormData) {
  const c = await ownerOnly();
  const email = s(fd, "email").toLowerCase();
  const role = s(fd, "role") as Role;
  const password = s(fd, "password");
  if (!email || !ROLES.includes(role)) back("Email dan role wajib diisi.");
  if (password.length < 8) back("Password minimal 8 karakter.");
  const { data, error } = await c.admin.auth.admin.createUser({
    email,
    password,
    email_confirm: true,
    user_metadata: { full_name: s(fd, "full_name") || email },
  });
  if (error || !data.user) back(error?.message ?? "Gagal membuat user.");
  await c.admin.from("memberships").insert({ org_id: c.orgId, user_id: data.user!.id, role });
  back();
}

export async function toggleMember(fd: FormData) {
  const c = await ownerOnly();
  const uid = s(fd, "user_id");
  if (uid === c.user.id) back("Tidak bisa menonaktifkan akun sendiri.");
  await c.admin.from("memberships").update({ is_active: s(fd, "active") === "1" }).eq("user_id", uid).eq("org_id", c.orgId);
  back();
}
