"use server";

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

export type SchemaSettings = {
  organizationName: string;
  organizationLogo: string;
  organizationLegalName: string;
  organizationFoundingDate: string;
  organizationAddress: string;
  organizationPhone: string;
  organizationEmail: string;
  socialFacebook: string;
  socialTwitter: string;
  socialYoutube: string;
  socialLinkedin: string;
  publisherType: "Organization" | "NewsMediaOrganization";
  defaultArticleType: "Article" | "NewsArticle" | "BlogPosting";
};

const KEYS: Record<keyof SchemaSettings, string> = {
  organizationName: "schema.organization_name",
  organizationLogo: "schema.organization_logo",
  organizationLegalName: "schema.organization_legal_name",
  organizationFoundingDate: "schema.organization_founding_date",
  organizationAddress: "schema.organization_address",
  organizationPhone: "schema.organization_phone",
  organizationEmail: "schema.organization_email",
  socialFacebook: "schema.social_facebook",
  socialTwitter: "schema.social_twitter",
  socialYoutube: "schema.social_youtube",
  socialLinkedin: "schema.social_linkedin",
  publisherType: "schema.publisher_type",
  defaultArticleType: "schema.default_article_type",
};

export async function loadSchemaSettings(): Promise<SchemaSettings> {
  const rows = await prisma.setting.findMany({
    where: { key: { in: Object.values(KEYS) } },
  });
  const map = new Map(rows.map((r) => [r.key, r.value]));

  return {
    organizationName: map.get(KEYS.organizationName) ?? "Finzone Network",
    organizationLogo:
      map.get(KEYS.organizationLogo) ?? "https://v2.finzone.io.vn/icon.svg",
    organizationLegalName: map.get(KEYS.organizationLegalName) ?? "",
    organizationFoundingDate: map.get(KEYS.organizationFoundingDate) ?? "",
    organizationAddress: map.get(KEYS.organizationAddress) ?? "",
    organizationPhone: map.get(KEYS.organizationPhone) ?? "",
    organizationEmail: map.get(KEYS.organizationEmail) ?? "",
    socialFacebook: map.get(KEYS.socialFacebook) ?? "",
    socialTwitter: map.get(KEYS.socialTwitter) ?? "",
    socialYoutube: map.get(KEYS.socialYoutube) ?? "",
    socialLinkedin: map.get(KEYS.socialLinkedin) ?? "",
    publisherType: (map.get(KEYS.publisherType) as "Organization" | "NewsMediaOrganization") ?? "NewsMediaOrganization",
    defaultArticleType: (map.get(KEYS.defaultArticleType) as "Article" | "NewsArticle" | "BlogPosting") ?? "NewsArticle",
  };
}

export async function saveSchemaSettings(
  formData: FormData,
): Promise<{ ok: boolean; error?: string }> {
  const user = await requireAdmin();

  const data: SchemaSettings = {
    organizationName: String(formData.get("organizationName") ?? "").trim(),
    organizationLogo: String(formData.get("organizationLogo") ?? "").trim(),
    organizationLegalName: String(formData.get("organizationLegalName") ?? "").trim(),
    organizationFoundingDate: String(formData.get("organizationFoundingDate") ?? "").trim(),
    organizationAddress: String(formData.get("organizationAddress") ?? "").trim(),
    organizationPhone: String(formData.get("organizationPhone") ?? "").trim(),
    organizationEmail: String(formData.get("organizationEmail") ?? "").trim(),
    socialFacebook: String(formData.get("socialFacebook") ?? "").trim(),
    socialTwitter: String(formData.get("socialTwitter") ?? "").trim(),
    socialYoutube: String(formData.get("socialYoutube") ?? "").trim(),
    socialLinkedin: String(formData.get("socialLinkedin") ?? "").trim(),
    publisherType: (formData.get("publisherType") as SchemaSettings["publisherType"]) ?? "NewsMediaOrganization",
    defaultArticleType: (formData.get("defaultArticleType") as SchemaSettings["defaultArticleType"]) ?? "NewsArticle",
  };

  if (!data.organizationName) return { ok: false, error: "Cần tên tổ chức." };

  for (const [field, key] of Object.entries(KEYS)) {
    const value = data[field as keyof SchemaSettings];
    await prisma.setting.upsert({
      where: { key },
      create: { key, value },
      update: { value },
    });
  }

  await prisma.auditLog.create({
    data: {
      actorId: user.id,
      actorName: user.name,
      actorEmail: user.email,
      source: "admin",
      action: "schema.update",
      target: "site-wide",
      meta: { fields: Object.keys(KEYS) } as never,
    },
  });

  revalidatePath("/admin/super-seo/schema");
  return { ok: true };
}
