import {
  canonicalPublicMediaUrl,
  normalizeMediaUrlsInHtml,
} from "@/lib/r2-media-url"

function isImageUrlFieldKey(key: string): boolean {
  const lower = key.toLowerCase()
  if (lower.includes("publicid")) return false
  if (lower.includes("heading") || lower.includes("folder")) return false
  if (lower.includes("videourl") || lower.includes("virtualtour")) return false
  if (lower.includes("mapurl") || lower.includes("sociallink")) return false
  if (lower === "image" || lower === "logo" || lower === "avatar" || lower === "doctorimage") {
    return true
  }
  if (lower === "mainimage" || lower === "beforeimage" || lower === "afterimage") return true
  if (lower.endsWith("image") && !lower.endsWith("images")) return true
  return false
}

function publicIdKeyForImageKey(key: string): string {
  const lower = key.toLowerCase()
  if (lower === "image" || lower === "doctorimage") return "imagePublicId"
  if (lower === "mainimage") return "mainImagePublicId"
  if (lower.endsWith("image")) return `${key}PublicId`
  return `${key}PublicId`
}

function isHtmlContentFieldKey(key: string): boolean {
  const lower = key.toLowerCase()
  return lower === "content" || lower === "overview" || lower.endsWith("content")
}

function normalizeValue(value: unknown): unknown {
  if (value === null || value === undefined) return value

  if (Array.isArray(value)) {
    return value.map((item) => normalizeValue(item))
  }

  if (typeof value === "object") {
    const record = value as Record<string, unknown>
    const out: Record<string, unknown> = {}

    for (const [key, raw] of Object.entries(record)) {
      if (typeof raw === "string") {
        const trimmed = raw.trim()
        if (isHtmlContentFieldKey(key)) {
          out[key] = normalizeMediaUrlsInHtml(raw)
          continue
        }
        if (isImageUrlFieldKey(key) && /^https?:\/\//i.test(trimmed)) {
          const pidKey = publicIdKeyForImageKey(key)
          const pid = typeof record[pidKey] === "string" ? record[pidKey] : undefined
          out[key] = canonicalPublicMediaUrl(trimmed, pid)
          continue
        }
        out[key] = raw
        continue
      }
      out[key] = normalizeValue(raw)
    }

    return out
  }

  return value
}

/** Deep-normalize API/DB payloads so image URLs always use `livistmedical.com/storage/...`. */
export function normalizePersistedMediaUrls<T>(value: T): T {
  return normalizeValue(value) as T
}
