/**
 * Tabela 1 — Parâmetros meteorológicos (NBR 6123:2023, sec. 5.3)
 *
 * Parâmetros b, p, Fᵣ usados na equação do fator S₂:
 *   S₂ = b · Fᵣ · (z/10)^p
 *
 * Válidos para o intervalo de tempo de 3 segundos e Classe A
 * (maior dimensão ≤ 20 m). Para outros intervalos, ver Anexo A.
 *
 * Fonte: NBR 6123:2023, p. 14 (Tabela 1).
 * Última auditoria: 2026-07-07 — valores conferidos com PDF oficial.
 */

import type { TerrainCategory, StructureClass } from '../wind-kernel';

export interface S2Parameters {
  readonly b: number;
  readonly p: number;
  readonly fr: number;
}

/** z_g (m): altura da camada limite atmosférica por categoria */
export const ZG_BY_CATEGORY: Readonly<Record<TerrainCategory, number>> = {
  I: 250,
  II: 300,
  III: 350,
  IV: 420,
  V: 500,
};

/** Tabela 1 — Parâmetros b, p, Fᵣ por categoria e classe */
export const TABLE_1: Readonly<
  Record<TerrainCategory, Record<StructureClass, S2Parameters>>
> = {
  I: {
    A: { b: 1.10, p: 0.06, fr: 1.00 },
    B: { b: 1.11, p: 0.065, fr: 0.98 },
    C: { b: 1.12, p: 0.07, fr: 0.95 },
  },
  II: {
    A: { b: 1.00, p: 0.085, fr: 1.00 },
    B: { b: 1.00, p: 0.09, fr: 0.98 },
    C: { b: 1.00, p: 0.10, fr: 0.95 },
  },
  III: {
    A: { b: 0.94, p: 0.10, fr: 1.00 },
    B: { b: 0.94, p: 0.105, fr: 0.98 },
    C: { b: 0.93, p: 0.115, fr: 0.95 },
  },
  IV: {
    A: { b: 0.86, p: 0.12, fr: 1.00 },
    B: { b: 0.85, p: 0.125, fr: 0.98 },
    C: { b: 0.84, p: 0.135, fr: 0.95 },
  },
  V: {
    A: { b: 0.74, p: 0.15, fr: 1.00 },
    B: { b: 0.73, p: 0.16, fr: 0.98 },
    C: { b: 0.71, p: 0.175, fr: 0.95 },
  },
};