import type { ArticlePendingImages } from "@/lib/media-manager/article-pending"

/**
 * Article media lifecycle:
 * - `articleId` identifies the article record (stable across consecutive saves in one session).
 * - `currentSlug` (form slug) is the sole source of truth for R2 storage paths.
 */

export function resolveArticleMediaSlug(currentSlug: string | undefined | null): string {
  return typeof currentSlug === "string" ? currentSlug.trim() : ""
}

export function resolveEffectiveArticleId(
  routeArticleId: string | undefined | null,
  sessionArticleId: string | undefined | null
): string | undefined {
  const route = typeof routeArticleId === "string" ? routeArticleId.trim() : ""
  const session = typeof sessionArticleId === "string" ? sessionArticleId.trim() : ""
  return route || session || undefined
}

export function isNewArticleSession(
  routeArticleId: string | undefined | null,
  sessionArticleId: string | undefined | null
): boolean {
  return !resolveEffectiveArticleId(routeArticleId, sessionArticleId)
}

/** True when the last persisted slug differs from the slug currently in the form. */
export function articleSlugChangedSincePersisted(
  persistedSlug: string | undefined | null,
  currentSlug: string | undefined | null
): boolean {
  const persisted = resolveArticleMediaSlug(persistedSlug)
  const current = resolveArticleMediaSlug(currentSlug)
  return !!persisted && !!current && persisted !== current
}

export interface ArticlePendingCommitContext {
  articleSlug: string
  articleId?: string
  pending: ArticlePendingImages
}

export function buildArticlePendingCommitContext(input: {
  currentSlug: string
  effectiveArticleId?: string
  pending: ArticlePendingImages
}): ArticlePendingCommitContext {
  const articleSlug = resolveArticleMediaSlug(input.currentSlug)
  if (!articleSlug) {
    throw new Error("Article slug is required before saving images.")
  }
  return {
    articleSlug,
    articleId: input.effectiveArticleId,
    pending: input.pending,
  }
}

/** Slug to store as "last persisted" after a successful save. */
export function articlePersistedSlugAfterSave(requestedSlug: string): string {
  return resolveArticleMediaSlug(requestedSlug)
}

type ArticleLocaleBlock = {
  content?: string | null
}

type SavedArticleMediaSlice = {
  slug?: unknown
  image?: unknown
  imagePublicId?: unknown
  content?: unknown
  translations?: unknown
}

/** Merge persisted media URLs from the API response back into the form after save. */
export function mergeArticleFormMediaFromSavedArticle<T extends {
  slug: string
  image: string
  imagePublicId: string
  content: string
  translations: {
    en: ArticleLocaleBlock & Record<string, unknown>
    ar: ArticleLocaleBlock & Record<string, unknown>
    tr: ArticleLocaleBlock & Record<string, unknown>
  }
}>(form: T, saved: SavedArticleMediaSlice): T {
  const tr = saved.translations
  const trRecord =
    tr && typeof tr === "object" ? (tr as Record<string, ArticleLocaleBlock>) : null

  const readLocaleContent = (locale: "en" | "ar" | "tr"): string | undefined => {
    const block = trRecord?.[locale]
    return typeof block?.content === "string" ? block.content : undefined
  }

  return {
    ...form,
    slug: typeof saved.slug === "string" ? saved.slug.trim() : form.slug,
    image: typeof saved.image === "string" ? saved.image : form.image,
    imagePublicId: typeof saved.imagePublicId === "string" ? saved.imagePublicId : form.imagePublicId,
    content: typeof saved.content === "string" ? saved.content : form.content,
    translations: {
      en: {
        ...form.translations.en,
        content: readLocaleContent("en") ?? form.translations.en.content,
      },
      ar: {
        ...form.translations.ar,
        content: readLocaleContent("ar") ?? form.translations.ar.content,
      },
      tr: {
        ...form.translations.tr,
        content: readLocaleContent("tr") ?? form.translations.tr.content,
      },
    },
  }
}
