"use client"

const DRAFT_IMAGE_FOLDERS_KEY = "draft_article_image_folders_v1"

/** TinyMCE inline uploads not yet cleared — flushed before logout while cookie still valid. */
export const PENDING_ARTICLE_INLINE_UPLOADS_KEY = "article_editor_pending_inline_uploads_v1"

type PendingArticleInlineUploadsPayload = { uploads: string[] }

export function persistPendingArticleInlineUploads(publicIds: Iterable<string>) {
  if (typeof window === "undefined") return
  const uploads = [...publicIds]
    .map((id) => (typeof id === "string" ? id.trim() : ""))
    .filter((id) => id.startsWith("articles/"))
  const unique = [...new Set(uploads)]
  if (unique.length === 0) {
    window.sessionStorage.removeItem(PENDING_ARTICLE_INLINE_UPLOADS_KEY)
    return
  }
  const payload: PendingArticleInlineUploadsPayload = { uploads: unique }
  window.sessionStorage.setItem(PENDING_ARTICLE_INLINE_UPLOADS_KEY, JSON.stringify(payload))
}

/**
 * Deletes abandoned editor uploads before clearing auth session (logout).
 * Must run **before** `POST /api/auth/logout` so admin APIs stay authenticated.
 */
export async function flushPendingArticleInlineUploadsBeforeLogout() {
  if (typeof window === "undefined") return
  let raw: string | null = null
  try {
    raw = window.sessionStorage.getItem(PENDING_ARTICLE_INLINE_UPLOADS_KEY)
    window.sessionStorage.removeItem(PENDING_ARTICLE_INLINE_UPLOADS_KEY)
  } catch {
    return
  }
  if (!raw) return
  let uploads: string[] = []
  try {
    const parsed = JSON.parse(raw) as unknown
    if (
      parsed &&
      typeof parsed === "object" &&
      Array.isArray((parsed as PendingArticleInlineUploadsPayload).uploads)
    ) {
      uploads = (parsed as PendingArticleInlineUploadsPayload).uploads.filter(
        (id): id is string => typeof id === "string" && id.startsWith("articles/")
      )
    }
  } catch {
    return
  }
  if (uploads.length === 0) return
  try {
    await fetch("/api/admin/articles/delete-inline-images", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ publicIds: [...new Set(uploads)] }),
      keepalive: true,
    })
  } catch {
    /* best effort */
  }
}

function normalizeFolder(folder: string): string {
  return folder.trim().replace(/\/+$/, "")
}

export function getDraftImageFolders(): string[] {
  if (typeof window === "undefined") return []
  try {
    const raw = window.sessionStorage.getItem(DRAFT_IMAGE_FOLDERS_KEY)
    if (!raw) return []
    const parsed = JSON.parse(raw)
    if (!Array.isArray(parsed)) return []
    return parsed
      .map((v) => (typeof v === "string" ? normalizeFolder(v) : ""))
      .filter((v) => v.startsWith("articles/"))
  } catch {
    return []
  }
}

export function addDraftImageFolder(folder: string) {
  if (typeof window === "undefined") return
  const normalized = normalizeFolder(folder)
  if (!normalized.startsWith("articles/")) return
  const next = new Set(getDraftImageFolders())
  next.add(normalized)
  window.sessionStorage.setItem(DRAFT_IMAGE_FOLDERS_KEY, JSON.stringify([...next]))
}

export function clearDraftImageFolders(folders?: string[]) {
  if (typeof window === "undefined") return
  if (!folders || folders.length === 0) {
    window.sessionStorage.removeItem(DRAFT_IMAGE_FOLDERS_KEY)
    return
  }
  const removeSet = new Set(folders.map(normalizeFolder))
  const kept = getDraftImageFolders().filter((f) => !removeSet.has(f))
  if (kept.length === 0) {
    window.sessionStorage.removeItem(DRAFT_IMAGE_FOLDERS_KEY)
    return
  }
  window.sessionStorage.setItem(DRAFT_IMAGE_FOLDERS_KEY, JSON.stringify(kept))
}

export async function cleanupDraftImageFolders(folders?: string[]) {
  const targets = (folders && folders.length > 0 ? folders : getDraftImageFolders())
    .map(normalizeFolder)
    .filter((v) => v.startsWith("articles/"))
  if (targets.length === 0) return
  try {
    await fetch("/api/admin/articles/cleanup-draft-images", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ folders: targets }),
      keepalive: true,
    })
  } finally {
    clearDraftImageFolders(targets)
  }
}

/** Delete listed R2 inline images (session uploads abandoned without save). */
export async function deleteArticleInlineImagesByPublicIds(publicIds: string[]) {
  const ids = publicIds.map((id) => id.trim()).filter((id) => id.startsWith("articles/"))
  if (ids.length === 0) return
  try {
    await fetch("/api/admin/articles/delete-inline-images", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ publicIds: ids }),
      keepalive: true,
    })
  } catch {
    /* best effort */
  }
}

