export type LocaleSuffixFn = (locale: string) => string

export interface PickLocalizedOptions {
  /** Base field stem — default `name` → `nameHe`/`nameEn` when suffix supplies `He`/`En`. */
  field?: string
  /** Host-supplied suffix convention — never baked `_he`/`_en` in the module. */
  suffix: LocaleSuffixFn
  /** Locales to try after the requested locale (e.g. default locale). */
  fallbacks?: readonly string[]
}

function readField<T extends Record<string, unknown>>(
  row: T,
  field: string,
  suffix: LocaleSuffixFn,
  locale: string,
): string | undefined {
  const key = `${field}${suffix(locale)}`
  if (!Object.hasOwn(row, key)) return undefined
  const val = row[key]
  if (val == null) return undefined
  return typeof val === 'string' ? val : String(val)
}

export function pickLocalized<T extends Record<string, unknown>>(
  row: T,
  locale: string,
  opts: PickLocalizedOptions,
): string {
  const field = opts.field ?? 'name'
  const locales = [locale, ...(opts.fallbacks ?? [])]
  for (const loc of locales) {
    const val = readField(row, field, opts.suffix, loc)
    if (val) return val
  }
  return ''
}
