import { toArticleFolderSegment } from "@/lib/media-manager/paths"
import { nextContentImageFileIndex } from "@/lib/media-manager/article-content-index"
import {
  collectArticleOldMediaBases,
  rewriteMediaPaths,
  rewriteMediaPathsMulti,
  relocateMediaBases,
} from "@/lib/media-manager/slug-relocate"

export {
  collectArticleOldMediaBases,
  relocateMediaBases,
  rewriteMediaPathsMulti,
  toArticleFolderSegment,
  nextContentImageFileIndex,
}

/** R2 prefix root for an article slug: `articles/{slug-segment}`. */
export function articleMediaBaseForSlug(slug: string): string {
  return `articles/${toArticleFolderSegment(slug)}`
}

/** R2 prefix for inline editor images: `articles/{slug}/content-images`. */
export function articleContentImagesPrefix(slug: string): string {
  return `${articleMediaBaseForSlug(slug)}/content-images`
}

/** Rewrite stored media keys and public URLs after a slug change (single base pair). */
export function rewriteArticleMediaPaths(
  value: unknown,
  oldBase: string,
  newBase: string
): unknown {
  return rewriteMediaPaths(value, oldBase, newBase)
}

/** Relocate all known article media roots and rewrite payload fields for a slug change. */
export async function applyArticleSlugMediaChange(input: {
  existingSlug: string
  existingContentImageFolder?: string | null
  newSlug: string
  payload: unknown
}): Promise<{ payload: unknown; newMediaBase: string }> {
  const oldBases = collectArticleOldMediaBases({
    slug: input.existingSlug,
    contentImageFolder: input.existingContentImageFolder,
  })
  const newMediaBase = articleMediaBaseForSlug(input.newSlug)

  const needsChange = oldBases.some((base) => base !== newMediaBase)
  if (!needsChange) {
    return { payload: input.payload, newMediaBase }
  }

  await relocateMediaBases(oldBases, newMediaBase)
  const payload = rewriteMediaPathsMulti(input.payload, oldBases, newMediaBase)

  return { payload, newMediaBase }
}
