"use server";

import { revalidatePath } from "next/cache";
import { prisma } from "@/lib/db";
import { requireAdmin } from "@/lib/admin-guard";

async function logAudit(
  user: { id: string; name: string; email: string },
  action: string,
  target: string,
  meta: Record<string, unknown>,
) {
  await prisma.auditLog.create({
    data: {
      actorId: user.id,
      actorName: user.name,
      actorEmail: user.email,
      source: "admin",
      action,
      target,
      meta: meta as never,
    },
  });
}

export async function unsubscribeAction(
  id: string,
): Promise<{ ok: boolean; error?: string }> {
  const user = await requireAdmin();
  const sub = await prisma.newsletterSubscriber.findUnique({ where: { id } });
  if (!sub) return { ok: false, error: "Không tìm thấy." };
  await prisma.newsletterSubscriber.update({
    where: { id },
    data: { status: "unsubscribed", unsubscribedAt: new Date() },
  });
  await logAudit(user, "newsletter.unsubscribe", id, { email: sub.email });
  revalidatePath("/admin/newsletter");
  return { ok: true };
}

export async function resubscribeAction(
  id: string,
): Promise<{ ok: boolean; error?: string }> {
  const user = await requireAdmin();
  const sub = await prisma.newsletterSubscriber.findUnique({ where: { id } });
  if (!sub) return { ok: false, error: "Không tìm thấy." };
  await prisma.newsletterSubscriber.update({
    where: { id },
    data: { status: "subscribed", unsubscribedAt: null, confirmedAt: new Date() },
  });
  await logAudit(user, "newsletter.resubscribe", id, { email: sub.email });
  revalidatePath("/admin/newsletter");
  return { ok: true };
}

export async function deleteSubscriberAction(
  id: string,
): Promise<{ ok: boolean; error?: string }> {
  const user = await requireAdmin();
  const sub = await prisma.newsletterSubscriber.findUnique({ where: { id } });
  if (!sub) return { ok: false, error: "Không tìm thấy." };
  await prisma.newsletterSubscriber.delete({ where: { id } });
  await logAudit(user, "newsletter.delete", id, { email: sub.email });
  revalidatePath("/admin/newsletter");
  return { ok: true };
}

export async function importEmailsAction(
  raw: string,
): Promise<{ ok: boolean; added: number; skipped: number; error?: string }> {
  const user = await requireAdmin();
  const lines = raw
    .split(/[\s,;]+/)
    .map((s) => s.trim().toLowerCase())
    .filter((s) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s));

  if (lines.length === 0) {
    return { ok: false, added: 0, skipped: 0, error: "Không có email hợp lệ trong input." };
  }

  let added = 0;
  let skipped = 0;
  for (const email of lines) {
    try {
      const result = await prisma.newsletterSubscriber.upsert({
        where: { email },
        create: {
          email,
          source: "import",
          status: "subscribed",
          confirmedAt: new Date(),
        },
        update: {},
      });
      // upsert always returns a row — distinguish create vs update by createdAt freshness
      if (Date.now() - result.createdAt.getTime() < 5000) {
        added++;
      } else {
        skipped++;
      }
    } catch {
      skipped++;
    }
  }
  await logAudit(user, "newsletter.import", "", {
    total: lines.length,
    added,
    skipped,
  });
  revalidatePath("/admin/newsletter");
  return { ok: true, added, skipped };
}
