export {
  DOCTOR_MEDIA_SECTIONS,
  HOSPITAL_MEDIA_SECTIONS,
  PROCEDURE_MEDIA_SECTIONS,
  ARTICLE_MEDIA_SECTIONS,
  type DoctorMediaSection,
  type HospitalMediaSection,
  type ProcedureMediaSection,
  type ArticleMediaSection,
  type StagedImage,
  type CommitImageInput,
  type CommitDoctorImageInput,
  type CommitHospitalImageInput,
  type CommitProcedureImageInput,
  type CommitArticleImageInput,
  type CommittedImage,
} from "./types"

export {
  toDoctorFolderSegment,
  normalizeDoctorSection,
  sanitizeFileBaseName,
  generateFileName,
  generateDoctorPrefix,
  generateDoctorPath,
  doctorMediaBaseForName,
  normalizeHospitalSection,
  generateHospitalPrefix,
  generateHospitalPath,
  normalizeProcedureSection,
  generateProcedurePrefix,
  generateProcedurePath,
  toArticleFolderSegment,
  normalizeArticleSection,
  generateArticlePrefix,
  generateArticlePath,
} from "./paths"

export {
  MEDIA_FILE_BASE,
  buildMediaFileBaseName,
  resolveUploadFileName,
  resolveUploadFileNameFromBody,
  type MediaFilePart,
} from "./file-names"

export { stageImage, revokeStagedImage, stageImageMeta, type StageImageOptions } from "./stage"

export {
  commitImage,
  commitImages,
  assertDoctorNameForMedia,
  assertHospitalSlugForMedia,
  assertProcedureSlugForMedia,
  assertArticleSlugForMedia,
  resolveDoctorUploadPrefix,
  resolveHospitalUploadPrefix,
  resolveProcedureUploadPrefix,
  resolveArticleUploadPrefix,
} from "./commit"

export { deleteMedia } from "./delete"

export { getMediaListByDoctor, type DoctorMediaListItem } from "./list"

export {
  commitPendingDoctorImages,
  createEmptyDoctorPendingImages,
  clearDoctorPendingImages,
  type DoctorPendingImages,
  type DoctorPendingProfileSlot,
  type DoctorPendingBeforeAfterSlot,
  type DoctorPendingSlot,
  type DoctorFormImageSlice,
} from "./doctor-pending"

export {
  commitPendingHospitalImages,
  createEmptyHospitalPendingImages,
  clearHospitalPendingImages,
  hospitalPendingHasAny,
  hospitalPendingKey,
  parseHospitalPendingKey,
  type HospitalPendingImages,
  type HospitalPendingLocaleKey,
  type HospitalFormImageSlice,
} from "./hospital-pending"

export {
  commitPendingProcedureImages,
  createEmptyProcedurePendingImages,
  clearProcedurePendingImages,
  procedurePendingHasAny,
  procedurePendingKey,
  parseProcedurePendingKey,
  type ProcedurePendingImages,
  type ProcedurePendingLocaleKey,
  type ProcedureFormImageSlice,
} from "./procedure-pending"

export {
  commitPendingArticleImages,
  createEmptyArticlePendingImages,
  clearArticlePendingImages,
  articlePendingHasAny,
  type ArticlePendingImages,
  type ArticleFormImageSlice,
} from "./article-pending"

export { nextContentImageFileIndex } from "./article-content-index"

export {
  normalizeMediaBase,
  uniqueMediaBases,
  rewriteMediaPaths,
  rewriteMediaPathsMulti,
  relocateMediaBases,
  collectArticleOldMediaBases,
} from "./slug-relocate"

export {
  MANAGED_ENTITY_MEDIA_ROOTS,
  isManagedEntityMediaKey,
  entityMediaBaseFromMediaKey,
  collectManagedMediaKeysFromPayload,
  collectStaleMediaBasesFromKeys,
  normalizeSavePayloadMediaToCurrentBase,
  rewriteMediaKeysToNewBase,
  deleteRemovedMediaKeysAfterNamespaceChange,
  reconcileEntityMediaAfterSave,
  type ReconcileEntityMediaAfterSaveInput,
  normalizeMediaKeySet,
  diffRemovedMediaKeys,
  mediaKeyUnderAnyBase,
  deleteRemovedMediaKeysBeforeNamespaceMove,
  purgeEntityMediaRootExcept,
  collectArticleMediaKeysFromSavePayload,
  collectArticleMediaKeysFromPersistedArticle,
  normalizeArticleSavePayloadMediaToCurrentSlug,
  articleMediaBaseFromMediaKey,
  collectStaleArticleMediaBasesFromKeys,
  deleteRemovedArticleMediaKeys,
  deleteRemovedArticleMediaKeysAfterSlugChange,
  rewriteArticleMediaKeysToNewBase,
  isManagedArticleMediaKey,
  reconcileArticleMediaAfterSave,
  type ReconcileArticleMediaAfterSaveInput,
} from "./slug-media-reconcile"

export {
  mergeHospitalFormMediaFromSavedForm,
  mergeProcedureFormMediaFromSavedForm,
  mergeDoctorFormMediaFromSavedDoctor,
} from "./entity-form-media"

export {
  resolveArticleMediaSlug,
  resolveEffectiveArticleId,
  isNewArticleSession,
  articleSlugChangedSincePersisted,
  buildArticlePendingCommitContext,
  articlePersistedSlugAfterSave,
  mergeArticleFormMediaFromSavedArticle,
  type ArticlePendingCommitContext,
} from "./article-lifecycle"

export {
  LOCAL_UPLOAD_ONLY_ERROR,
  UPLOAD_DATA_URI_ONLY_ERROR,
  FORBIDDEN_UPLOAD_BODY_KEYS,
  getManagedMediaOrigins,
  isBlobOrDataImageSource,
  isRemoteHttpUrl,
  isManagedMediaUrl,
  isExternalImageUrl,
  isValidUploadDataUri,
  assertValidUploadDataUri,
  getPersistedImageUrlError,
  assertPersistedImageUrl,
  validateLocalImageFile,
} from "./local-upload-policy"

export {
  validateImageUploadRequest,
  type ImageUploadRequestValidation,
} from "./validate-upload-request"

export {
  getPersistedMediaValidationError,
  findExternalImagesInHtml,
  assertManagedHtmlImages,
} from "./validate-persisted-payload"

export { getApproximateDataUriSizeInBytes } from "./data-uri-size"

export {
  rejectExternalImageUrlInput,
  validateImageFileForUpload,
} from "./client-guards"
