import "server-only";
import path from "node:path";
import { randomBytes } from "node:crypto";
import { STORAGE_ROOT, ensureDir } from "@/lib/upload";

// ──────────────────────────────────────────────────────────────────────────
// Ablage der Cloud-Dateien: `storage/cloud/<zufälliger Name>`.
// Der Anzeigename steht nur in der Datenbank — so kann kein Dateiname vom
// Nutzer den Pfad beeinflussen.
// ──────────────────────────────────────────────────────────────────────────

export const CLOUD_DIR = path.join(STORAGE_ROOT, "cloud");

/** 50 MB je Datei — größere Uploads brauchen einen Streaming-Umbau. */
export const MAX_CLOUD_BYTES = 50 * 1024 * 1024;

export function makeCloudName(): string {
  return randomBytes(20).toString("hex");
}

export function isSafeCloudName(name: string): boolean {
  return /^[a-f0-9]{40}$/.test(name);
}

export async function cloudDir(): Promise<string> {
  await ensureDir(CLOUD_DIR);
  return CLOUD_DIR;
}

export function cloudPath(storedName: string): string {
  return path.join(CLOUD_DIR, storedName);
}

// Typen, die gefahrlos direkt im Browser angezeigt werden dürfen.
// SVG und HTML sind bewusst NICHT dabei — die können Skripte enthalten und
// würden im Kontext der Anwendung ausgeführt.
const INLINE_MIME = new Set([
  "image/png",
  "image/jpeg",
  "image/webp",
  "image/gif",
  "image/avif",
  "application/pdf",
  "video/mp4",
  "video/webm",
  "video/ogg",
  "audio/mpeg",
  "audio/ogg",
  "audio/wav",
  "audio/webm",
  "audio/mp4",
  "text/plain",
]);

export function isInlineSafe(mime: string): boolean {
  return INLINE_MIME.has(mime.toLowerCase());
}

export { kindOf, formatBytes, cleanFileName, type FileKind } from "./format";
