﻿import { NextRequest, NextResponse } from "next/server"
import { assertProcedureSlugForMedia } from "@/lib/media-manager/commit"
import { resolveUploadFileNameFromBody } from "@/lib/media-manager/file-names"
import { generateProcedurePrefix, normalizeProcedureSection } from "@/lib/media-manager/paths"
import { getApproximateDataUriSizeInBytes } from "@/lib/media-manager/data-uri-size"
import { validateImageUploadRequest } from "@/lib/media-manager/validate-upload-request"
import { uploadImage } from "@/lib/r2-storage"
import { toProcedureFolderSegment } from "@/lib/procedure-db"

const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024

export async function POST(req: NextRequest) {
  try {
    const rawBody = await req.json()
    const uploadValidation = validateImageUploadRequest(rawBody)
    if (!uploadValidation.ok) {
      return NextResponse.json({ error: uploadValidation.error }, { status: 400 })
    }
    const dataUri = uploadValidation.dataUri
    const body = uploadValidation.body
    const sectionRaw = body.section
    const procedureSlugRaw = body.procedureSlug
    let procedureSlug: string
    try {
      procedureSlug = assertProcedureSlugForMedia(
        typeof procedureSlugRaw === "string" ? procedureSlugRaw : ""
      )
    } catch (e) {
      const message = e instanceof Error ? e.message : "Procedure slug is required"
      return NextResponse.json({ error: message }, { status: 400 })
    }

    const sizeBytes = getApproximateDataUriSizeInBytes(dataUri)
    if (sizeBytes > MAX_IMAGE_SIZE_BYTES) {
      return NextResponse.json({ error: "Image size must be 5 MB or less" }, { status: 400 })
    }

    const section =
      typeof sectionRaw === "string" ? normalizeProcedureSection(sectionRaw) : "overview"
    const prefix = generateProcedurePrefix(toProcedureFolderSegment(procedureSlug), section)
    const fileBaseName = resolveUploadFileNameFromBody(section, body)

    const { url, mediaKey } = await uploadImage(dataUri, { prefix, fileBaseName })

    return NextResponse.json({ url, publicId: mediaKey, folder: prefix }, { status: 200 })
  } catch (err) {
    console.error("[procedures/upload-image] error:", err)
    return NextResponse.json({ error: "Upload failed" }, { status: 500 })
  }
}
