"use server";

import { prisma } from "@/lib/db";
import { requireAdmin } from "@/lib/admin-guard";
import { chat, loadAiConfig, type ChatMessage } from "@/lib/ai/openai";

const MAX_PROMPT_LENGTH = 8000;

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

export async function runPromptAction(formData: FormData) {
  const user = await requireAdmin();
  const cfg = await loadAiConfig();
  if (!cfg) {
    return {
      ok: false as const,
      error: "Chưa cấu hình AI provider. Mở /admin/settings → AI Provider.",
    };
  }

  const system = String(formData.get("system") ?? "").slice(0, MAX_PROMPT_LENGTH);
  const prompt = String(formData.get("prompt") ?? "").slice(0, MAX_PROMPT_LENGTH);
  const temperature = Number(formData.get("temperature") ?? 0.6);
  const maxTokens = Math.max(50, Math.min(4000, Number(formData.get("maxTokens") ?? 800)));

  if (!prompt.trim()) return { ok: false as const, error: "Thiếu prompt." };

  const messages: ChatMessage[] = [];
  if (system.trim()) messages.push({ role: "system", content: system.trim() });
  messages.push({ role: "user", content: prompt });

  try {
    const result = await chat(cfg, messages, { temperature, maxTokens });
    await logAi(user, "ai.run_prompt", {
      model: result.model,
      latencyMs: result.latencyMs,
      promptTokens: result.usage?.promptTokens,
      completionTokens: result.usage?.completionTokens,
      promptPreview: prompt.slice(0, 120),
    });
    return {
      ok: true as const,
      output: result.content,
      meta: {
        model: result.model,
        latencyMs: result.latencyMs,
        promptTokens: result.usage?.promptTokens ?? 0,
        completionTokens: result.usage?.completionTokens ?? 0,
        totalTokens: result.usage?.totalTokens ?? 0,
      },
    };
  } catch (e) {
    const msg = e instanceof Error ? e.message : String(e);
    await logAi(user, "ai.run_prompt.fail", {
      error: msg.slice(0, 240),
      promptPreview: prompt.slice(0, 120),
    });
    return { ok: false as const, error: msg };
  }
}

export async function generateMetaAction(articleId: string) {
  const user = await requireAdmin();
  const cfg = await loadAiConfig();
  if (!cfg) {
    return {
      ok: false as const,
      error: "Chưa cấu hình AI provider. Mở /admin/settings → AI Provider.",
    };
  }
  const article = await prisma.article.findUnique({
    where: { id: articleId },
    select: { id: true, title: true, content: true, focusKeyword: true, slug: true },
  });
  if (!article) return { ok: false as const, error: "Không tìm thấy bài." };

  // Strip HTML to keep token usage low
  const plain = (article.content ?? "")
    .replace(/<[^>]+>/g, " ")
    .replace(/\s+/g, " ")
    .trim()
    .slice(0, 4000);

  const focus = article.focusKeyword ? `\nFocus keyword: ${article.focusKeyword}` : "";
  const messages: ChatMessage[] = [
    {
      role: "system",
      content:
        "Bạn là chuyên gia SEO tiếng Việt. Sinh meta title (≤60 ký tự) và meta description (≤155 ký tự). Trả lời CHÍNH XÁC theo định dạng:\nTITLE: <meta title>\nDESC: <meta description>",
    },
    {
      role: "user",
      content: `Tựa bài: ${article.title}${focus}\n\nNội dung tóm tắt:\n${plain}`,
    },
  ];
  try {
    const result = await chat(cfg, messages, { temperature: 0.4, maxTokens: 250 });
    const titleMatch = result.content.match(/TITLE:\s*(.+?)(?:\n|$)/i);
    const descMatch = result.content.match(/DESC:\s*([\s\S]+?)(?:\n\n|$)/i);
    const metaTitle = titleMatch?.[1]?.trim().slice(0, 60) ?? "";
    const metaDesc = descMatch?.[1]?.trim().slice(0, 160) ?? "";

    if (!metaTitle && !metaDesc) {
      return {
        ok: false as const,
        error: `AI trả về không đúng format. Raw output:\n${result.content.slice(0, 400)}`,
      };
    }

    await prisma.article.update({
      where: { id: articleId },
      data: {
        ...(metaTitle ? { metaTitle } : {}),
        ...(metaDesc ? { metaDesc } : {}),
      },
    });
    await logAi(user, "ai.generate_meta", {
      articleId,
      slug: article.slug,
      latencyMs: result.latencyMs,
      tokens: result.usage?.totalTokens,
    });
    return {
      ok: true as const,
      metaTitle,
      metaDesc,
      meta: {
        model: result.model,
        latencyMs: result.latencyMs,
        tokens: result.usage?.totalTokens ?? 0,
      },
    };
  } catch (e) {
    return { ok: false as const, error: e instanceof Error ? e.message : String(e) };
  }
}

export async function pingProviderAction() {
  await requireAdmin();
  const cfg = await loadAiConfig();
  if (!cfg) return { ok: false as const, error: "Chưa cấu hình." };
  try {
    const result = await chat(
      cfg,
      [{ role: "user", content: "Trả lời một từ duy nhất: pong" }],
      { temperature: 0, maxTokens: 10 },
    );
    return {
      ok: true as const,
      content: result.content.trim(),
      latencyMs: result.latencyMs,
      model: result.model,
    };
  } catch (e) {
    return { ok: false as const, error: e instanceof Error ? e.message : String(e) };
  }
}
