export const DOCTOR_LOCALES = ["en", "ar", "tr"] as const
export type DoctorLocale = (typeof DOCTOR_LOCALES)[number]

export type DoctorTranslationPayload = {
  name: string
  description: string | null
  credentials: unknown
  biography: string | null
  doctorStatement: string | null
  specialties: unknown
  beforeAfter: unknown
  reviews: unknown
  faq: unknown
  credentialsHeading?: { title: string; subtitle: string } | null
  biographyHeading?: { title: string; subtitle: string } | null
  specialtiesHeading?: { title: string; subtitle: string } | null
  beforeAfterHeading?: { eyebrow: string; title: string; subtitle: string } | null
  reviewsHeading?: { title: string; subtitle: string } | null
  faqHeading?: { title: string; subtitle: string } | null
  tags: string[]
  languages: string[]
}

type DoctorTranslationLike = {
  locale: string
  name: string | null
  description: string | null
  credentials: unknown
  biography: string | null
  doctorStatement: string | null
  specialties: unknown
  beforeAfter: unknown
  reviews: unknown
  faq: unknown
  /** DB stores JSON in LongText — may be string or parsed object from adapters */
  credentialsHeading?: unknown
  biographyHeading?: unknown
  specialtiesHeading?: unknown
  beforeAfterHeading?: unknown
  reviewsHeading?: unknown
  faqHeading?: unknown
  tags: unknown
  languages: unknown
}

function normalizeStringArray(value: unknown): string[] {
  if (!Array.isArray(value)) return []
  const out: string[] = []
  const seen = new Set<string>()
  for (const item of value) {
    if (typeof item !== "string") continue
    const normalized = item.trim().replace(/\s+/g, " ")
    if (!normalized) continue
    const key = normalized.toLowerCase()
    if (seen.has(key)) continue
    seen.add(key)
    out.push(normalized)
  }
  return out
}

/** Store `Doctor.tags` / `Doctor.languages` (and translation columns) as JSON in LongText. */
export function serializeDoctorListFieldForDb(items: string[]): string {
  return JSON.stringify(items)
}

/** Read list fields persisted as JSON (or legacy comma / newline separated text). */
export function parseDoctorListFieldFromDb(value: unknown): string[] {
  if (Array.isArray(value)) return normalizeStringArray(value)
  if (typeof value !== "string") return []
  const trimmed = value.trim()
  if (!trimmed) return []
  try {
    const parsed = JSON.parse(trimmed) as unknown
    if (Array.isArray(parsed)) return normalizeStringArray(parsed)
    if (typeof parsed === "string") return normalizeStringArray([parsed])
  } catch {
    /* legacy plain text */
  }
  return normalizeStringArray(
    trimmed
      .split(/[,،\n\r]+/)
      .map((s) => s.trim())
      .filter(Boolean)
  )
}

/** Read JSON stored in Prisma `String` @db.LongText columns. */
export function unwrapDoctorLongTextJson(value: unknown): unknown {
  if (value === null || value === undefined) return value
  if (typeof value !== "string") return value
  const t = value.trim()
  if (!t) return null
  try {
    return JSON.parse(t) as unknown
  } catch {
    return value
  }
}

/** Write structured payloads to LongText string columns. */
export function serializeDoctorLongTextJson(value: unknown): string | null {
  if (value === null || value === undefined) return null
  if (typeof value === "string") {
    const t = value.trim()
    return t === "" ? null : value
  }
  try {
    return JSON.stringify(value)
  } catch {
    return null
  }
}

export function parseDoctorJsonObjectFromDb(value: unknown): object {
  const u = unwrapDoctorLongTextJson(value)
  return u !== null && typeof u === "object" && !Array.isArray(u) ? (u as object) : {}
}

export function parseDoctorJsonArrayFromDb(value: unknown): unknown[] {
  const u = unwrapDoctorLongTextJson(value)
  return Array.isArray(u) ? u : []
}

function parseDoctorTitleSubtitleHeadingFromDb(value: unknown): { title: string; subtitle: string } | null {
  const u = unwrapDoctorLongTextJson(value)
  if (u === null || typeof u !== "object" || Array.isArray(u)) return null
  const o = u as Record<string, unknown>
  return { title: String(o.title ?? ""), subtitle: String(o.subtitle ?? "") }
}

function parseDoctorBeforeAfterHeadingFromDb(value: unknown): {
  eyebrow: string
  title: string
  subtitle: string
} | null {
  const u = unwrapDoctorLongTextJson(value)
  if (u === null || typeof u !== "object" || Array.isArray(u)) return null
  const o = u as Record<string, unknown>
  return {
    eyebrow: String(o.eyebrow ?? ""),
    title: String(o.title ?? ""),
    subtitle: String(o.subtitle ?? ""),
  }
}

function normalizeName(value: unknown): string {
  return typeof value === "string" ? value.trim() : ""
}

function normalizeDescription(value: unknown): string | null {
  if (typeof value !== "string") return null
  const trimmed = value.trim()
  return trimmed === "" ? null : trimmed
}

export function parseDoctorLocale(raw: string | null): DoctorLocale {
  if (raw === "ar" || raw === "tr" || raw === "en") return raw
  return "en"
}

export function parseDoctorTranslationInput(value: unknown): DoctorTranslationPayload {
  if (!value || typeof value !== "object") {
    return {
      name: "",
      description: null,
      credentials: {},
      biography: null,
      doctorStatement: null,
      specialties: [],
      beforeAfter: [],
      reviews: [],
      faq: [],
      credentialsHeading: null,
      biographyHeading: null,
      specialtiesHeading: null,
      beforeAfterHeading: null,
      reviewsHeading: null,
      faqHeading: null,
      tags: [],
      languages: [],
    }
  }
  const source = value as Record<string, unknown>
  const nestedBiography =
    source.biography && typeof source.biography === "object"
      ? (source.biography as Record<string, unknown>)
      : null
  return {
    name: normalizeName(source.name),
    description: normalizeDescription(source.description),
    credentials: source.credentials ?? {},
    biography: normalizeDescription(nestedBiography ? nestedBiography.biography : source.biography),
    doctorStatement: normalizeDescription(
      nestedBiography ? nestedBiography.doctorStatement : source.doctorStatement
    ),
    specialties: source.specialties ?? [],
    beforeAfter: source.beforeAfter ?? [],
    reviews: source.reviews ?? [],
    faq: source.faq ?? [],
    credentialsHeading:
      source.credentialsHeading && typeof source.credentialsHeading === "object"
        ? { title: String((source.credentialsHeading as any).title ?? ""), subtitle: String((source.credentialsHeading as any).subtitle ?? "") }
        : null,
    biographyHeading:
      source.biographyHeading && typeof source.biographyHeading === "object"
        ? { title: String((source.biographyHeading as any).title ?? ""), subtitle: String((source.biographyHeading as any).subtitle ?? "") }
        : null,
    specialtiesHeading:
      source.specialtiesHeading && typeof source.specialtiesHeading === "object"
        ? { title: String((source.specialtiesHeading as any).title ?? ""), subtitle: String((source.specialtiesHeading as any).subtitle ?? "") }
        : null,
    beforeAfterHeading:
      source.beforeAfterHeading && typeof source.beforeAfterHeading === "object"
        ? {
            eyebrow: String((source.beforeAfterHeading as any).eyebrow ?? ""),
            title: String((source.beforeAfterHeading as any).title ?? ""),
            subtitle: String((source.beforeAfterHeading as any).subtitle ?? ""),
          }
        : null,
    reviewsHeading:
      source.reviewsHeading && typeof source.reviewsHeading === "object"
        ? { title: String((source.reviewsHeading as any).title ?? ""), subtitle: String((source.reviewsHeading as any).subtitle ?? "") }
        : null,
    faqHeading:
      source.faqHeading && typeof source.faqHeading === "object"
        ? { title: String((source.faqHeading as any).title ?? ""), subtitle: String((source.faqHeading as any).subtitle ?? "") }
        : null,
    tags: normalizeStringArray(source.tags),
    languages: normalizeStringArray(source.languages),
  }
}

export function parseDoctorPayloadTranslations(payload: Record<string, unknown>) {
  const root =
    payload.translations && typeof payload.translations === "object"
      ? (payload.translations as Record<string, unknown>)
      : {}

  const en = parseDoctorTranslationInput(root.en)
  const ar = parseDoctorTranslationInput(root.ar)
  const tr = parseDoctorTranslationInput(root.tr)

  if (!en.name) {
    en.name = normalizeName(payload.name)
  }
  if (en.description === null) {
    en.description = normalizeDescription(payload.description)
  }
  if (en.biography === null) {
    en.biography = normalizeDescription(payload.biography)
  }
  if (en.doctorStatement === null) {
    en.doctorStatement = normalizeDescription(payload.doctorStatement)
  }
  if (
    (!en.credentials || typeof en.credentials !== "object" || Object.keys(en.credentials as Record<string, unknown>).length === 0) &&
    payload.credentials &&
    typeof payload.credentials === "object"
  ) {
    en.credentials = payload.credentials
  }
  if (Array.isArray(en.specialties) && en.specialties.length === 0 && Array.isArray(payload.specialties)) {
    en.specialties = payload.specialties
  }
  if (Array.isArray(en.beforeAfter) && en.beforeAfter.length === 0 && Array.isArray(payload.beforeAfter)) {
    en.beforeAfter = payload.beforeAfter
  }
  if (Array.isArray(en.reviews) && en.reviews.length === 0 && Array.isArray(payload.reviews)) {
    en.reviews = payload.reviews
  }
  if (Array.isArray(en.faq) && en.faq.length === 0 && Array.isArray(payload.faq)) {
    en.faq = payload.faq
  }
  if (en.tags.length === 0 && Array.isArray(payload.tags)) {
    en.tags = normalizeStringArray(payload.tags)
  }
  if (en.languages.length === 0 && Array.isArray(payload.languages)) {
    en.languages = normalizeStringArray(payload.languages)
  }
  // fallback for headings: prefer translations.en but fall back to top-level payload
  if ((en.credentialsHeading === null || en.credentialsHeading === undefined) && payload.credentialsHeading && typeof payload.credentialsHeading === "object") {
    en.credentialsHeading = {
      title: String((payload.credentialsHeading as any).title ?? ""),
      subtitle: String((payload.credentialsHeading as any).subtitle ?? ""),
    }
  }
  if ((en.biographyHeading === null || en.biographyHeading === undefined) && payload.biographyHeading && typeof payload.biographyHeading === "object") {
    en.biographyHeading = {
      title: String((payload.biographyHeading as any).title ?? ""),
      subtitle: String((payload.biographyHeading as any).subtitle ?? ""),
    }
  }
  if ((en.specialtiesHeading === null || en.specialtiesHeading === undefined) && payload.specialtiesHeading && typeof payload.specialtiesHeading === "object") {
    en.specialtiesHeading = {
      title: String((payload.specialtiesHeading as any).title ?? ""),
      subtitle: String((payload.specialtiesHeading as any).subtitle ?? ""),
    }
  }
  if ((en.beforeAfterHeading === null || en.beforeAfterHeading === undefined) && payload.beforeAfterHeading && typeof payload.beforeAfterHeading === "object") {
    en.beforeAfterHeading = {
      eyebrow: String((payload.beforeAfterHeading as any).eyebrow ?? ""),
      title: String((payload.beforeAfterHeading as any).title ?? ""),
      subtitle: String((payload.beforeAfterHeading as any).subtitle ?? ""),
    }
  }
  if ((en.reviewsHeading === null || en.reviewsHeading === undefined) && payload.reviewsHeading && typeof payload.reviewsHeading === "object") {
    en.reviewsHeading = {
      title: String((payload.reviewsHeading as any).title ?? ""),
      subtitle: String((payload.reviewsHeading as any).subtitle ?? ""),
    }
  }
  if ((en.faqHeading === null || en.faqHeading === undefined) && payload.faqHeading && typeof payload.faqHeading === "object") {
    en.faqHeading = {
      title: String((payload.faqHeading as any).title ?? ""),
      subtitle: String((payload.faqHeading as any).subtitle ?? ""),
    }
  }

  return { en, ar, tr }
}

export function buildDoctorTranslations(
  base: {
    name: string
    description: string | null
    credentials: unknown
    biography: string | null
    doctorStatement: string | null
    specialties: unknown
    beforeAfter: unknown
    reviews: unknown
    faq: unknown
    tags: unknown
    languages: unknown
    credentialsHeading?: unknown
    biographyHeading?: unknown
    specialtiesHeading?: unknown
    beforeAfterHeading?: unknown
    reviewsHeading?: unknown
    faqHeading?: unknown
  },
  rows: DoctorTranslationLike[]
) {
  const emptyLocale = (): DoctorTranslationPayload => ({
    name: "",
    description: null,
    credentials: {},
    biography: null,
    doctorStatement: null,
    specialties: [],
    beforeAfter: [],
    reviews: [],
    faq: [],
    credentialsHeading: null,
    biographyHeading: null,
    specialtiesHeading: null,
    beforeAfterHeading: null,
    reviewsHeading: null,
    faqHeading: null,
    tags: [],
    languages: [],
  })
  const translations: Record<DoctorLocale, DoctorTranslationPayload> = {
    en: emptyLocale(),
    ar: emptyLocale(),
    tr: emptyLocale(),
  }

  for (const row of rows) {
    if (row.locale !== "en" && row.locale !== "ar" && row.locale !== "tr") continue
    translations[row.locale] = {
      name: normalizeName(row.name),
      description: normalizeDescription(row.description),
      credentials: parseDoctorJsonObjectFromDb(row.credentials),
      biography: normalizeDescription(row.biography),
      doctorStatement: normalizeDescription(row.doctorStatement),
      specialties: parseDoctorJsonArrayFromDb(row.specialties),
      beforeAfter: parseDoctorJsonArrayFromDb(row.beforeAfter),
      reviews: parseDoctorJsonArrayFromDb(row.reviews),
      faq: parseDoctorJsonArrayFromDb(row.faq),
      credentialsHeading: parseDoctorTitleSubtitleHeadingFromDb(row.credentialsHeading),
      biographyHeading: parseDoctorTitleSubtitleHeadingFromDb(row.biographyHeading),
      specialtiesHeading: parseDoctorTitleSubtitleHeadingFromDb(row.specialtiesHeading),
      beforeAfterHeading: parseDoctorBeforeAfterHeadingFromDb(row.beforeAfterHeading),
      reviewsHeading: parseDoctorTitleSubtitleHeadingFromDb(row.reviewsHeading),
      faqHeading: parseDoctorTitleSubtitleHeadingFromDb(row.faqHeading),
      tags: parseDoctorListFieldFromDb(row.tags),
      languages: parseDoctorListFieldFromDb(row.languages),
    }
  }

  if (!translations.en.name) {
    translations.en = {
      name: normalizeName(base.name),
      description: normalizeDescription(base.description),
      credentials: parseDoctorJsonObjectFromDb(base.credentials),
      biography: normalizeDescription(base.biography),
      doctorStatement: normalizeDescription(base.doctorStatement),
      specialties: parseDoctorJsonArrayFromDb(base.specialties),
      beforeAfter: parseDoctorJsonArrayFromDb(base.beforeAfter),
      reviews: parseDoctorJsonArrayFromDb(base.reviews),
      faq: parseDoctorJsonArrayFromDb(base.faq),
      credentialsHeading: parseDoctorTitleSubtitleHeadingFromDb(base.credentialsHeading),
      biographyHeading: parseDoctorTitleSubtitleHeadingFromDb(base.biographyHeading),
      specialtiesHeading: parseDoctorTitleSubtitleHeadingFromDb(base.specialtiesHeading),
      beforeAfterHeading: parseDoctorBeforeAfterHeadingFromDb(base.beforeAfterHeading),
      reviewsHeading: parseDoctorTitleSubtitleHeadingFromDb(base.reviewsHeading),
      faqHeading: parseDoctorTitleSubtitleHeadingFromDb(base.faqHeading),
      tags: parseDoctorListFieldFromDb(base.tags),
      languages: parseDoctorListFieldFromDb(base.languages),
    }
  }

  return translations
}

export function resolveDoctorTranslation(
  translations: ReturnType<typeof buildDoctorTranslations>,
  locale: string
) {
  const preferred = parseDoctorLocale(locale)
  if (translations[preferred].name) return translations[preferred]
  return translations.en
}
