"use server";

import { revalidatePath } from "next/cache";
import { hasPermission } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { IntranetArticle } from "@/models/IntranetArticle";
import { Client } from "@/models/Client";

const INTRANET_PATH = "/de/admin/intranet";

type FormState = { error?: string };

async function currentStaffName(): Promise<string> {
  const clientId = await getSessionClientId();
  if (!clientId) return "";
  const client = await Client.findById(clientId).select("name").lean();
  return client?.name || "";
}

export async function createIntranetArticleAction(_prev: FormState, formData: FormData): Promise<FormState> {
  if (!(await hasPermission("intranet_create"))) return { error: "Keine Berechtigung." };
  const title = String(formData.get("title") || "").trim();
  const content = String(formData.get("content") || "").trim();
  if (!title) return { error: "Bitte einen Titel eingeben." };
  if (!content) return { error: "Bitte einen Inhalt eingeben." };

  await connectDB();
  await IntranetArticle.create({
    title,
    content,
    category: String(formData.get("category") || "").trim() || "Allgemein",
    visibleToDepartmentIds: formData.getAll("departmentIds").map(String).filter(Boolean),
    pinned: formData.get("pinned") === "on",
    visible: formData.get("visible") === "on",
    sortOrder: Date.now(),
    lastEditedByName: await currentStaffName(),
  });

  revalidatePath(INTRANET_PATH);
  return {};
}

export async function updateIntranetArticleAction(articleId: string, formData: FormData) {
  if (!(await hasPermission("intranet_edit"))) return;
  const title = String(formData.get("title") || "").trim();
  const content = String(formData.get("content") || "").trim();
  if (!title || !content) return;

  await connectDB();
  // "visible" bewusst nicht Teil dieses Formulars — läuft über den
  // separaten Schalter in der Zeile, wie bei der FAQ.
  await IntranetArticle.findByIdAndUpdate(articleId, {
    title,
    content,
    category: String(formData.get("category") || "").trim() || "Allgemein",
    visibleToDepartmentIds: formData.getAll("departmentIds").map(String).filter(Boolean),
    pinned: formData.get("pinned") === "on",
    lastEditedByName: await currentStaffName(),
  });

  revalidatePath(INTRANET_PATH);
}

export async function setIntranetArticleVisibleAction(articleId: string, visible: boolean) {
  if (!(await hasPermission("intranet_edit"))) return;
  await connectDB();
  await IntranetArticle.findByIdAndUpdate(articleId, { visible });
  revalidatePath(INTRANET_PATH);
}

export async function moveIntranetArticleAction(articleId: string, direction: "up" | "down") {
  if (!(await hasPermission("intranet_edit"))) return;
  await connectDB();
  const item = await IntranetArticle.findById(articleId).lean();
  if (!item) return;

  const neighbor = await IntranetArticle.findOne(
    direction === "up" ? { sortOrder: { $lt: item.sortOrder } } : { sortOrder: { $gt: item.sortOrder } }
  )
    .sort({ sortOrder: direction === "up" ? -1 : 1 })
    .lean();
  if (!neighbor) return;

  await Promise.all([
    IntranetArticle.findByIdAndUpdate(item._id, { sortOrder: neighbor.sortOrder }),
    IntranetArticle.findByIdAndUpdate(neighbor._id, { sortOrder: item.sortOrder }),
  ]);
  revalidatePath(INTRANET_PATH);
}

export async function deleteIntranetArticleAction(articleId: string) {
  if (!(await hasPermission("intranet_delete"))) return;
  await connectDB();
  await IntranetArticle.findByIdAndDelete(articleId);
  revalidatePath(INTRANET_PATH);
}
