import type { StagedImage } from "@/lib/media-manager/types"
import { buildMediaFileBaseName, type MediaFilePart } from "@/lib/media-manager/file-names"
import { generateFileName as generateFileNameFromOriginal } from "@/lib/media-manager/paths"
import { validateLocalImageFile } from "@/lib/media-manager/local-upload-policy"

export interface StageImageOptions {
  maxBytes?: number
  /** Section-aligned file base name (e.g. reviews, main-photo). */
  fileBaseName?: string
  fileIndex?: number
  filePart?: MediaFilePart
}

/** Store a file locally with a preview URL — no R2 upload. */
export function stageImage(file: File, options: StageImageOptions = {}): StagedImage {
  const fileError = validateLocalImageFile(file, options.maxBytes)
  if (fileError) {
    throw new Error(fileError)
  }

  const fileName =
    typeof options.fileBaseName === "string" && options.fileBaseName.trim()
      ? buildMediaFileBaseName(options.fileBaseName, {
          index: options.fileIndex,
          part: options.filePart,
        })
      : generateFileNameFromOriginal(file.name) || `image-${Date.now().toString(36)}`

  return {
    id:
      typeof crypto !== "undefined" && "randomUUID" in crypto
        ? crypto.randomUUID()
        : `staged-${Date.now()}-${Math.random().toString(36).slice(2)}`,
    file,
    previewUrl: URL.createObjectURL(file),
    fileName,
  }
}

export function revokeStagedImage(staged: StagedImage | null | undefined) {
  if (!staged?.previewUrl?.startsWith("blob:")) return
  try {
    URL.revokeObjectURL(staged.previewUrl)
  } catch {
    /* ignore */
  }
}

/** Server-side staging helper when a buffer is already available. */
export function stageImageMeta(originalName?: string): Pick<StagedImage, "fileName"> {
  return { fileName: generateFileNameFromOriginal(originalName ?? "") }
}
