/**
 * Ler JSON de site alheio sem confiar no formato: todo campo pode faltar, vir
 * com outro tipo ou vir aninhado de um jeito diferente do que a documentação
 * da plataforma promete.
 */

export type Objeto = Record<string, unknown>;

export function objeto(valor: unknown): Objeto | null {
  return valor && typeof valor === "object" && !Array.isArray(valor) ? (valor as Objeto) : null;
}

export function lista(valor: unknown): unknown[] {
  if (Array.isArray(valor)) return valor;
  return valor === undefined || valor === null ? [] : [valor];
}

export function texto(valor: unknown): string {
  if (typeof valor === "string") return valor;
  if (typeof valor === "number" && Number.isFinite(valor)) return String(valor);
  return "";
}

/** O primeiro texto não vazio entre os candidatos. */
export function primeiroTexto(...valores: unknown[]): string {
  for (const valor of valores) {
    const lido = texto(valor).trim();
    if (lido) return lido;
  }
  return "";
}

export function lerJson(bruto: string): unknown {
  try {
    return JSON.parse(bruto);
  } catch {
    return null;
  }
}
