/**
 * Tabela 31 — Parâmetros γ e ξ para a determinação de efeitos
 * dinâmicos (NBR 6123:2023, sec. 9.3.1).
 *
 * Fonte: NBR 6123:2023, p. 62 (Tabela 31).
 * Última auditoria: 2026-07-08 — auditado e condizente com a norma.
 */

export interface DynamicStructureParams {
  /** Expoente γ do modo fundamental */
  gamma: number;
  /** Taxa de amortecimento crítico ξ (em %) */
  xiPercent: number;
  /** Fórmula para frequência aproximada (Hz) */
  freqFormula: string;
}

export const TABLE_31: readonly DynamicStructureParams[] = [
  {
    gamma: 1.2,
    xiPercent: 2.0,
    freqFormula: 'f₁ ≈ 0,05 + 0,015/h (h em m)',
  },
  {
    gamma: 1.0,
    xiPercent: 2.0,
    freqFormula: 'f₁ ≈ 0,05 + 0,015/h',
  },
  {
    gamma: 2.7,
    xiPercent: 1.5,
    freqFormula: 'f₁ ≈ 0,02·h (h em m)',
  },
  {
    gamma: 1.7,
    xiPercent: 1.0,
    freqFormula: 'f₁ ≈ 0,015·h',
  },
  {
    gamma: 1.2,
    xiPercent: 1.0,
    freqFormula: 'f₁ ≈ 0,20/h − 0,04',
  },
  {
    gamma: 1.7,
    xiPercent: 0.8,
    freqFormula: 'f₁ ≈ dependente da estrutura',
  },
  {
    gamma: 0,
    xiPercent: 3.0,
    freqFormula: 'f₁ ≈ dependente da estrutura',
  },
] as const;

export type StructureDynamicType =
  | 'portal-concrete'
  | 'concrete-shearwall'
  | 'concrete-tower-variable'
  | 'concrete-tower-uniform'
  | 'steel-welded'
  | 'steel-tower-uniform'
  | 'wood';

export function getDynamicParams(type: StructureDynamicType): DynamicStructureParams {
  const idx: Record<StructureDynamicType, number> = {
    'portal-concrete': 0,
    'concrete-shearwall': 1,
    'concrete-tower-variable': 2,
    'concrete-tower-uniform': 3,
    'steel-welded': 4,
    'steel-tower-uniform': 5,
    wood: 6,
  };
  return TABLE_31[idx[type]];
}

/**
 * Estimativa simplificada da frequência fundamental f₁ (Hz) para edifícios.
 * f₁ = γ · h / ...  (Tabela 31 fornece fórmulas por tipo)
 */
export function estimateFundamentalFrequency(type: StructureDynamicType, height: number): number {
  switch (type) {
    case 'portal-concrete':
    case 'concrete-shearwall':
      return 0.05 + 0.015 / height;
    case 'concrete-tower-variable':
      return 0.02 * height;
    case 'concrete-tower-uniform':
    case 'steel-tower-uniform':
      return 0.015 * height;
    case 'steel-welded':
      return Math.max(0.5, 0.2 / height - 0.04);
    case 'wood':
      return 0.5;
  }
}