import { NextResponse } from "next/server";
import { mkdir } from "node:fs/promises";
import path from "node:path";
import sharp from "sharp";
import { seoSlug } from "@/lib/seo-slug";
import { adminAuthorized } from "@/lib/admin-auth";
import { recordAudit } from "@/lib/audit";

export const runtime = "nodejs";

export async function POST(request: Request) {
  if (!(await adminAuthorized(request, true))) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  const form = await request.formData();
  const file = form.get("file");
  if (!(file instanceof File)) return NextResponse.json({ error: "File is required" }, { status: 400 });
  if (file.size > 8 * 1024 * 1024) return NextResponse.json({ error: "Максимальный размер — 8 МБ" }, { status: 400 });
  try {
    const image = sharp(Buffer.from(await file.arrayBuffer()), { failOn: "error" });
    const metadata = await image.metadata();
    if (!metadata.format || !metadata.width || !metadata.height) throw new Error("Файл не является изображением");
    const safeName = seoSlug(String(form.get("name") || form.get("slug") || "menu-item"));
    const filename = `${safeName}-${Date.now()}.webp`;
    await mkdir(path.join(process.cwd(), "public/uploads/menu"), { recursive: true });
    await image.resize({ withoutEnlargement: true }).webp({ quality: 82 }).toFile(path.join(process.cwd(), "public/uploads/menu", filename));
    await recordAudit("image_upload", { entityType: "menu_item", entityId: String(form.get("slug") || ""), details: { filename } });
    return NextResponse.json({ url: `/uploads/menu/${filename}` });
  } catch (error) { return NextResponse.json({ error: error instanceof Error ? error.message : "Invalid image" }, { status: 400 }); }
}
