/**
 * Coeficientes aerodinâmicos — NBR 6123:2023, sec. 6.1
 *
 * Esta é a versão "oficial" que consome as Tabelas 6-12 com
 * interpolação bilinear. Substitui `nbr-coefficients.ts` (versão
 * provisória com valores hardcoded).
 *
 * Exposto por módulo:
 *  - getWallCpeOfficial  → Tabela 6 (paredes de planta retangular)
 *  - getRoofCpeOfficial  → Tabela 7 (telhados duas águas)
 *  - getShedRoofCpe      → Tabela 8 (telhado uma água)
 *  - getValleyRoofCpe    → Tabela 9 (calha central)
 *  - getMultiSpanCpe     → Tabela 10 (múltiplos simétricos)
 *  - getAsymmetricMultiSpan → Tabela 11
 *  - getMultiSpanVertical → Tabela 12
 */

import { getWallCpeNBR6123 } from './nbr-tables/table-6';
import { getRoofCpeNBR6123 } from './nbr-tables/table-7';
import { getShedRoofCpeNBR6123 } from './nbr-tables/table-8';
import { getValleyRoofCpeNBR6123 } from './nbr-tables/table-9';
import { getMultiSpanSymmetricCpeNBR6123 } from './nbr-tables/table-10';

export interface WallCoefficients {
  A: number;
  B: number;
  C: number;
  D: number;
}

export interface RoofCoefficients {
  E: number;
  F: number;
  G: number;
  H: number;
  I: number;
  J: number;
}

/**
 * Coeficientes de pressão externa para paredes.
 * Mantém compatibilidade com a interface anterior { A, B, C, D }.
 *
 * Mapeamento das zonas da Tabela 6:
 *  - α=0°: A=A1B1, B=A2B2, C=C, D=D
 *  - α=90°: A=A, B=B, C=C1D1, D=C2D2
 */
export function getWallCpeOfficial(
  a: number,
  b: number,
  h: number,
  windAngle: 0 | 90 = 0,
): WallCoefficients {
  const all = getWallCpeNBR6123(a, b, h);
  if (windAngle === 0) {
    return {
      A: all.alpha0.A1B1,
      B: all.alpha0.A2B2,
      C: all.alpha0.C,
      D: all.alpha0.D,
    };
  }
  return {
    A: all.alpha90.A,
    B: all.alpha90.B,
    C: all.alpha90.C1D1,
    D: all.alpha90.C2D2,
  };
}

export function getRoofCpeOfficial(
  _a: number,
  b: number,
  h: number,
  theta: number,
  windAngle: 0 | 90 = 0,
): RoofCoefficients {
  return getRoofCpeNBR6123(h, b, theta, windAngle);
}

export function getShedRoofCpe(theta: number, windAngle: 0 | 90 | 180 | 270 = 0) {
  // @ts-ignore
  return getShedRoofCpeNBR6123(theta, windAngle);
}

export function getValleyRoofCpe(a: number, b: number, h: number, hLine: number) {
  return getValleyRoofCpeNBR6123(a, b, h, hLine);
}

export function getMultiSpanCpe(theta: number) {
  return getMultiSpanSymmetricCpeNBR6123(theta);
}
