﻿import { NextRequest, NextResponse } from "next/server"
import { assertArticleSlugForMedia } from "@/lib/media-manager/commit"
import { resolveUploadFileNameFromBody } from "@/lib/media-manager/file-names"
import { generateArticlePrefix, normalizeArticleSection } 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 { toArticleFolderSegment } from "@/lib/article-media"

const MAX_IMAGE_SIZE_BYTES = 1 * 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 articleSlugRaw = body.articleSlug

    let articleSlug: string
    try {
      articleSlug = assertArticleSlugForMedia(
        typeof articleSlugRaw === "string" ? articleSlugRaw : ""
      )
    } catch (e) {
      const message = e instanceof Error ? e.message : "Article 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 1 MB or less" }, { status: 400 })
    }

    const section =
      typeof sectionRaw === "string" ? normalizeArticleSection(sectionRaw) : "content-images"
    const prefix = generateArticlePrefix(toArticleFolderSegment(articleSlug), 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("[articles/upload-image] error:", err)
    return NextResponse.json({ error: "Upload failed" }, { status: 500 })
  }
}
