import { revalidatePath } from "next/cache";

import { getSessionUser } from "@/lib/auth";
import {
  getAppVersionPolicies,
  isAppPlatform,
  isLegacyNativeAuthEnabled,
  saveAppVersionPolicy,
  setLegacyNativeAuthEnabled,
  type AppUpdateMode,
} from "@/lib/app-version-policy";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";
import {
  countLegacyNativeAppMailboxes,
  revokeAllLegacyNativeAppCredentials,
} from "@/lib/mail-external-access";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

async function requireAdmin() {
  const user = await getSessionUser();
  return user && isKavenixAdminEmail(user.email) ? user : null;
}

export async function GET() {
  if (!(await requireAdmin())) return Response.json({ error: "forbidden" }, { status: 403 });
  return Response.json({
    ok: true,
    policies: (await getAppVersionPolicies()).filter((policy) => policy.platform !== "windows-exe"),
    legacyNativeAuthEnabled: await isLegacyNativeAuthEnabled(),
    legacyMailboxCount: await countLegacyNativeAppMailboxes(),
  });
}

export async function PUT(request: Request) {
  const user = await requireAdmin();
  if (!user) return Response.json({ error: "forbidden" }, { status: 403 });
  const body = await request.json().catch(() => null) as Record<string, unknown> | null;
  if (!body) return Response.json({ error: "invalid-json" }, { status: 400 });

  try {
    if (body.action === "legacy-native-auth") {
      if (typeof body.enabled !== "boolean") throw new Error("invalid-enabled");
      await setLegacyNativeAuthEnabled(body.enabled, user.email);
      const result = body.enabled
        ? { revoked: 0, remaining: await countLegacyNativeAppMailboxes() }
        : await revokeAllLegacyNativeAppCredentials();
      revalidatePath("/kavenix");
      return Response.json({ ok: true, legacyNativeAuthEnabled: body.enabled, ...result });
    }
    if (!isAppPlatform(body.platform) || body.platform === "windows-exe") throw new Error("invalid-platform");
    const latestVersion = String(body.latestVersion ?? "").trim();
    const latestBuild = Number(body.latestBuild);
    const policy = await saveAppVersionPolicy({
      platform: body.platform,
      latestVersion,
      latestBuild,
      minimumVersion: String(body.minimumVersion ?? "").trim(),
      minimumBuild: Number(body.minimumBuild),
      updateMode: body.updateMode as AppUpdateMode,
      releaseNotes: String(body.releaseNotes ?? "").trim(),
    }, user.email);
    revalidatePath("/kavenix");
    return Response.json({ ok: true, policy });
  } catch (error) {
    const code = error instanceof Error ? error.message : "save-failed";
    return Response.json({ error: code, message: {
      "invalid-platform": "배포 채널을 확인해주세요.",
      "invalid-version": "버전은 1.0.37처럼 입력해주세요.",
      "invalid-build": "빌드 번호는 0 이상의 정수로 입력해주세요.",
      "invalid-update-mode": "업데이트 방식을 선택해주세요.",
      "minimum-above-latest": "최소 지원 버전은 최신 버전보다 높을 수 없습니다.",
      "release-notes-too-long": "안내 문구는 1,000자 이내로 입력해주세요.",
    }[code] ?? "버전 정책을 저장하지 못했습니다." }, { status: 400 });
  }
}
