import fs from "fs/promises";
import path from "path";
import { redirect } from "next/navigation";
import { isAdminSession, getAllPermissions } from "@/lib/adminAuth";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";

export const dynamic = "force-dynamic";

// Vom Electron-Build (separates Projekt/Repo, rakku-v2-desktop) auf jedem
// Release aktualisiert und per nginx-alias unter /app-updates/ ausgeliefert
// (autoindex bewusst aus, siehe Kommentar unten bei den Downloadlinks) -
// reines lokales Dateisystem, kein Netzwerkzugriff nötig.
const UPDATES_DIR = "/var/www/rakku-app-updates";

type ReleaseFile = { url: string; size: number };
type ReleaseManifest = { version: string; files: ReleaseFile[] };

// electron-updater's latest.yml/latest-mac.yml ist absichtlich sehr simple,
// flache YAML (ein "version:"-Feld + eine Liste von Dateien mit url/sha512/
// size) - für genau diese feste, enge Form reicht ein kleiner Parser mit
// zwei Regexes locker aus. Eine echte YAML-Lib (js-yaml liegt zwar transitiv
// in node_modules, ist aber keine direkte Abhängigkeit dieses Projekts) für
// zwei Zeilen Struktur einzubinden wäre unnötiger Overhead.
function parseReleaseManifest(content: string): ReleaseManifest | null {
  const versionMatch = content.match(/^version:\s*(.+)$/m);
  if (!versionMatch) return null;
  const files: ReleaseFile[] = [];
  const fileBlocks = content.split(/^\s*-\s*url:\s*/m).slice(1);
  for (const block of fileBlocks) {
    const url = block.split("\n")[0].trim();
    const sizeMatch = block.match(/^\s*size:\s*(\d+)/m);
    files.push({ url, size: sizeMatch ? Number(sizeMatch[1]) : 0 });
  }
  return { version: versionMatch[1].trim(), files };
}

async function readManifest(filename: string): Promise<ReleaseManifest | null> {
  try {
    const content = await fs.readFile(path.join(UPDATES_DIR, filename), "utf8");
    return parseReleaseManifest(content);
  } catch {
    return null;
  }
}

function formatSize(bytes: number): string {
  if (!bytes) return "";
  return `${(bytes / (1024 * 1024)).toFixed(0)} MB`;
}

function DownloadCard({
  title,
  file,
  hint,
}: {
  title: string;
  file: ReleaseFile | undefined;
  hint?: string;
}) {
  return (
    <div className="rounded-xl border border-white/10 bg-[var(--rk-surface)] p-5 flex flex-col gap-3">
      <div>
        <h2 className="text-sm font-semibold text-[var(--rk-ink)]">{title}</h2>
        {file && <p className="mt-0.5 text-xs text-[var(--rk-ink-muted)]">{formatSize(file.size)}</p>}
      </div>
      {file ? (
        // /app-updates/ wird direkt von nginx ausgeliefert (autoindex off,
        // damit niemand den Ordner durchsuchen kann - einzelne, bekannte
        // Dateinamen funktionieren trotzdem ganz normal), nicht von Next.js -
        // deshalb ein simpler <a>-Link statt eines API-Routes.
        <a
          href={`/app-updates/${encodeURIComponent(file.url)}`}
          className="self-start rounded-lg bg-[var(--rk-accent)] px-3.5 py-1.5 text-[0.7rem] font-semibold uppercase tracking-[0.1em] text-[#141413] transition-opacity hover:opacity-90"
        >
          Herunterladen
        </a>
      ) : (
        <p className="text-xs text-[var(--rk-ink-muted)]">Aktuell nicht verfügbar.</p>
      )}
      {hint && <p className="text-xs text-[var(--rk-ink-muted)]">{hint}</p>}
    </div>
  );
}

export default async function AdminMitarbeiterAppPage() {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Fmitarbeiter-app");
  const permissions = await getAllPermissions();

  const [windows, mac] = await Promise.all([readManifest("latest.yml"), readManifest("latest-mac.yml")]);
  const macArm = mac?.files.find((f) => f.url.includes("arm64"));
  const macIntel = mac?.files.find((f) => !f.url.includes("arm64"));
  const version = windows?.version || mac?.version;

  const gatekeeperHint =
    "Noch nicht von Apple signiert (kein Apple-Entwicklerkonto bisher) - beim ersten Start nicht doppelklicken, sondern Rechtsklick auf die App → Öffnen, sonst blockiert macOS den Start.";

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader
        title="Mitarbeiter-App"
        subtitle={
          version
            ? `Aktuelle Version: ${version} — läuft parallel zur Website, gleicher Login.`
            : "Läuft parallel zur Website, gleicher Login."
        }
      />

      <div className="grid gap-4 sm:grid-cols-3">
        <DownloadCard title="Windows" file={windows?.files[0]} />
        <DownloadCard title="Mac (Apple Silicon)" file={macArm} hint={gatekeeperHint} />
        <DownloadCard title="Mac (Intel)" file={macIntel} hint={gatekeeperHint} />
      </div>

      {!windows && !mac && (
        <p className="mt-6 text-sm text-[var(--rk-ink-muted)]">Aktuell ist keine Version verfügbar.</p>
      )}
    </main>
  );
}
