"use server";

import { revalidatePath } from "next/cache";
import { hasPermission } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { ContractTemplate, type ContractTemplateSection, type ContractTemplateType } from "@/models/ContractTemplate";
import { DEFAULT_STANDARD_SECTIONS, DEFAULT_TFP_SECTIONS, defaultAgbSection } from "@/lib/contractTemplateDefaults";
import { getSettings } from "@/lib/settings";

const TEMPLATES_PATH = "/de/admin/contract-templates";

// Lazy angelegt beim ersten Aufruf statt per Migration — analog zu
// getOrCreateOrdersCalendar/getPortfolioCategories in diesem Projekt. Die
// AGB werden nur beim allerersten Anlegen als Startwert übernommen, danach
// lebt der Text unabhängig in der Vorlage weiter (siehe Kommentar in
// contractTemplateDefaults.ts).
export async function getContractTemplateSections(type: ContractTemplateType): Promise<ContractTemplateSection[]> {
  await connectDB();
  const existing = await ContractTemplate.findOne({ type }).lean();
  if (existing) return existing.sections;

  const settings = await getSettings();
  const agbText = settings.legal?.termsTextDe || "";
  const defaults =
    type === "tfp"
      ? [...DEFAULT_TFP_SECTIONS.slice(0, 14), defaultAgbSection(agbText), DEFAULT_TFP_SECTIONS[14]]
      : [...DEFAULT_STANDARD_SECTIONS.slice(0, 4), defaultAgbSection(agbText), DEFAULT_STANDARD_SECTIONS[4]];

  const created = await ContractTemplate.findOneAndUpdate(
    { type },
    { $setOnInsert: { type, sections: defaults } },
    { upsert: true, returnDocument: "after", setDefaultsOnInsert: true }
  ).lean();
  return created?.sections ?? defaults;
}

export async function updateContractTemplateAction(type: ContractTemplateType, formData: FormData) {
  if (!(await hasPermission("contract_templates"))) return;

  const headings = formData.getAll("heading").map(String);
  const bodies = formData.getAll("body").map(String);
  const appendixFlags = formData.getAll("appendix").map(String);
  const sections: ContractTemplateSection[] = headings
    .map((heading, i) => ({ heading: heading.trim(), body: (bodies[i] || "").trim(), appendix: appendixFlags[i] === "on" }))
    .filter((s) => s.heading);

  await connectDB();
  await ContractTemplate.findOneAndUpdate({ type }, { $set: { sections } }, { upsert: true });
  revalidatePath(TEMPLATES_PATH);
}
