﻿import { NextRequest, NextResponse } from "next/server"
import { assertHospitalSlugForMedia } from "@/lib/media-manager/commit"
import { resolveUploadFileNameFromBody } from "@/lib/media-manager/file-names"
import { generateHospitalPrefix, normalizeHospitalSection } 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 { toHospitalFolderSegment } from "@/lib/hospital-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 hospitalSlugRaw = body.hospitalSlug
    let hospitalSlug: string
    try {
      hospitalSlug = assertHospitalSlugForMedia(
        typeof hospitalSlugRaw === "string" ? hospitalSlugRaw : ""
      )
    } catch (e) {
      const message = e instanceof Error ? e.message : "Hospital 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" ? normalizeHospitalSection(sectionRaw) : "gallery"
    const prefix = generateHospitalPrefix(toHospitalFolderSegment(hospitalSlug), 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("[hospitals/upload-image] error:", err)
    return NextResponse.json({ error: "Upload failed" }, { status: 500 })
  }
}
