import { redirect } from "next/navigation";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { IntranetArticle } from "@/models/IntranetArticle";
import { Department } from "@/models/Department";
import { Client } from "@/models/Client";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { NewIntranetArticleForm } from "@/components/admin/NewIntranetArticleForm";
import { IntranetBrowser } from "@/components/admin/IntranetBrowser";

export const dynamic = "force-dynamic";

// Bewusst kein hasPermission("intranet_view")-Check — anders als jeder
// andere Admin-Bereich ist das Ansehen hier für jede:s eingeloggte
// Team-Mitglied immer möglich (siehe CREATE_EDIT_DELETE_AREAS in
// lib/permissions.ts). Nur Anlegen/Bearbeiten/Löschen ist eingeschränkt.
export default async function AdminIntranetPage({ searchParams }: { searchParams: Promise<{ open?: string }> }) {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Fintranet");
  const { open } = await searchParams;

  const [permissions, canCreate, canEdit, canDelete, viewerId] = await Promise.all([
    getAllPermissions(),
    hasPermission("intranet_create"),
    hasPermission("intranet_edit"),
    hasPermission("intranet_delete"),
    getSessionClientId(),
  ]);

  await connectDB();
  const [departments, viewer] = await Promise.all([
    Department.find({}).sort({ sortOrder: 1 }).lean(),
    viewerId ? Client.findById(viewerId).select("departmentId").lean() : null,
  ]);
  const viewerDepartmentId = viewer?.departmentId ? String(viewer.departmentId) : null;

  // Wer bearbeiten darf, hat vollen Überblick über alles (auch Entwürfe und
  // fremde Abteilungen) — alle anderen sehen nur Sichtbares, und bei
  // abteilungsbeschränkten Beiträgen nur die der eigenen Abteilung (leere
  // Abteilungsliste = für alle sichtbar).
  const items = await IntranetArticle.find(
    canEdit
      ? {}
      : {
          visible: true,
          $or: [
            { visibleToDepartmentIds: { $size: 0 } },
            ...(viewerDepartmentId ? [{ visibleToDepartmentIds: viewerDepartmentId }] : []),
          ],
        }
  )
    .sort({ sortOrder: 1 })
    .lean();

  const departmentOptions = departments.map((d) => ({ id: String(d._id), name: d.name, color: d.color }));

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader
        title="Intranet"
        subtitle="Interne Abläufe und Anleitungen fürs ganze Team — jede:r kann hier nachlesen, unabhängig von sonstigen Rechten. Nicht zu verwechseln mit der öffentlichen FAQ."
      />

      {canCreate && <NewIntranetArticleForm departments={departmentOptions} />}

      <IntranetBrowser
        items={items.map((item) => ({
          id: String(item._id),
          title: item.title,
          content: item.content,
          category: item.category,
          visible: item.visible,
          pinned: item.pinned,
          lastEditedByName: item.lastEditedByName,
          updatedAt: item.updatedAt.toISOString(),
          departmentIds: item.visibleToDepartmentIds.map(String),
        }))}
        departments={departmentOptions}
        canEdit={canEdit}
        canDelete={canDelete}
        highlightId={open || null}
      />
    </main>
  );
}
