/**
 * ذخیره روی دیسک همین سرور، در پوشه UPLOAD_DIR (پیش‌فرض .data/uploads).
 * فایل‌ها از مسیر /media/... سرو می‌شوند (src/app/media/[...path]/route.ts).
 * برای یک سرور تکی (VPS) مناسب است؛ اگر چند سرور دارید از s3 استفاده کنید.
 */
import "server-only";
import { mkdir, rm, writeFile } from "node:fs/promises";
import path from "node:path";
import type { FileStorage } from "./storage";

export const MEDIA_PREFIX = "/media/";

/** کلید معتبر: فقط حروف لاتین، عدد، - _ . و / (بدون .. و بدون شروع با /) */
export function isSafeKey(key: string) {
  return /^[a-z0-9][a-z0-9/_.-]{0,200}$/i.test(key) && !key.split("/").some((p) => p === ".." || p === "." || p === "");
}

export function localStorage(dir: string): FileStorage {
  const root = path.resolve(dir);
  const fullPath = (key: string) => {
    if (!isSafeKey(key)) throw new Error("کلید فایل نامعتبر است");
    return path.join(root, key);
  };
  return {
    id: "local",
    async put(key, body) {
      const file = fullPath(key);
      await mkdir(path.dirname(file), { recursive: true });
      await writeFile(file, body);
    },
    async remove(keys) {
      await Promise.all(keys.map((k) => rm(fullPath(k), { force: true })));
    },
    publicUrl: (key) => MEDIA_PREFIX + key,
    keyFromUrl: (url) => (url.startsWith(MEDIA_PREFIX) ? url.slice(MEDIA_PREFIX.length) : undefined),
  };
}

/** خواندن فایل برای سرو (با کنترل مسیر) */
export function localFilePath(dir: string, key: string) {
  return isSafeKey(key) ? path.join(path.resolve(dir), key) : undefined;
}
