﻿import { NextRequest, NextResponse } from "next/server"
import { assertDoctorNameForMedia } from "@/lib/media-manager/commit"
import { resolveUploadFileNameFromBody } from "@/lib/media-manager/file-names"
import { generateDoctorPrefix, normalizeDoctorSection } 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"

const MAX_IMAGE_SIZE_BYTES = 2 * 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 doctorNameRaw = body.doctorName
    let doctorName: string
    try {
      doctorName = assertDoctorNameForMedia(
        typeof doctorNameRaw === "string" ? doctorNameRaw : ""
      )
    } catch (e) {
      const message = e instanceof Error ? e.message : "Doctor name 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 2 MB or less" }, { status: 400 })
    }

    const section =
      typeof sectionRaw === "string" ? normalizeDoctorSection(sectionRaw) : "doctor-photo"
    const prefix = generateDoctorPrefix(doctorName, section)
    const fileBaseName = resolveUploadFileNameFromBody(section, body)

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

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