"use server";
import { db } from "@/lib/db";
import { revalidatePath } from "next/cache";
import bcrypt from "bcryptjs";
import { randomUUID } from "crypto";

async function upsertMany(entries: { key: string; value: string }[]) {
  for (const { key, value } of entries) {
    await db.siteSetting.upsert({
      where: { key },
      update: { value },
      create: { key, value },
    });
  }
}

export async function saveCompanySettings(formData: FormData) {
  await upsertMany([
    { key: "site_name", value: (formData.get("site_name") as string).trim() },
    { key: "site_tagline", value: (formData.get("site_tagline") as string).trim() },
    { key: "site_logo_url", value: (formData.get("site_logo_url") as string).trim() },
    { key: "site_favicon_url", value: (formData.get("site_favicon_url") as string).trim() },
    { key: "admin_email", value: (formData.get("admin_email") as string).trim() },
    { key: "support_email", value: (formData.get("support_email") as string).trim() },
    { key: "site_phone", value: (formData.get("site_phone") as string).trim() },
    { key: "site_address", value: (formData.get("site_address") as string).trim() },
    { key: "site_timezone", value: (formData.get("site_timezone") as string).trim() },
    { key: "site_country", value: (formData.get("site_country") as string).trim() },
    { key: "site_currency", value: (formData.get("site_currency") as string).trim() },
  ]);
  revalidatePath("/admin/settings");
}

export async function saveSocialSettings(formData: FormData) {
  await upsertMany([
    { key: "whatsapp_number", value: (formData.get("whatsapp_number") as string).trim() },
    { key: "whatsapp_enabled", value: formData.get("whatsapp_enabled") === "true" ? "true" : "false" },
    { key: "facebook_url", value: (formData.get("facebook_url") as string).trim() },
    { key: "instagram_url", value: (formData.get("instagram_url") as string).trim() },
    { key: "twitter_url", value: (formData.get("twitter_url") as string).trim() },
    { key: "linkedin_url", value: (formData.get("linkedin_url") as string).trim() },
    { key: "youtube_url", value: (formData.get("youtube_url") as string).trim() },
  ]);
  revalidatePath("/admin/settings");
}

export async function saveStripeSettings(formData: FormData) {
  await upsertMany([
    { key: "stripe_mode", value: formData.get("stripe_mode") as string },
    { key: "stripe_live_secret_key", value: (formData.get("stripe_live_secret_key") as string).trim() },
    { key: "stripe_live_publishable_key", value: (formData.get("stripe_live_publishable_key") as string).trim() },
    { key: "stripe_live_webhook_secret", value: (formData.get("stripe_live_webhook_secret") as string).trim() },
    { key: "stripe_sandbox_secret_key", value: (formData.get("stripe_sandbox_secret_key") as string).trim() },
    { key: "stripe_sandbox_publishable_key", value: (formData.get("stripe_sandbox_publishable_key") as string).trim() },
    { key: "stripe_sandbox_webhook_secret", value: (formData.get("stripe_sandbox_webhook_secret") as string).trim() },
  ]);
  revalidatePath("/admin/settings");
  revalidatePath("/", "layout");
}

export async function saveEmailSettings(formData: FormData) {
  await upsertMany([
    { key: "mailgun_domain", value: (formData.get("mailgun_domain") as string).trim() },
    { key: "mailgun_api_key", value: (formData.get("mailgun_api_key") as string).trim() },
    { key: "mailgun_region", value: (formData.get("mailgun_region") as string).trim() },
    { key: "mail_from_name", value: (formData.get("mail_from_name") as string).trim() },
    { key: "mail_from_address", value: (formData.get("mail_from_address") as string).trim() },
    { key: "mail_reply_to", value: (formData.get("mail_reply_to") as string).trim() },
  ]);
  revalidatePath("/admin/settings");
}

export async function saveTesterSettings(formData: FormData) {
  const mode = formData.get("tester_mode") as string;
  const newPassword = (formData.get("tester_password") as string ?? "").trim();

  await upsertMany([
    { key: "tester_mode", value: mode === "true" ? "true" : "false" },
  ]);

  // Only update password + token if a new password was provided
  if (newPassword) {
    const hash = await bcrypt.hash(newPassword, 12);
    const token = randomUUID();
    await upsertMany([
      { key: "tester_password", value: hash },
      { key: "tester_token", value: token },
    ]);
  }

  revalidatePath("/admin/settings");
  revalidatePath("/", "layout");
}
