/**
 * Tabela 8 — Coeficientes de pressão e de forma, externos, para telhados
 * com uma água, em edificações de planta retangular (h/b < 2).
 * (NBR 6123:2023, sec. 6.1.1).
 *
 * Fonte: NBR 6123:2023, p. 22 (Tabela 8).
 * Última auditoria: 2026-07-08 — valores exatos do PDF implementados.
 */

import { linearInterp1D } from '../log-interp';

const THETA = [5, 10, 15, 20, 25, 30] as const;

export type WindAngleT8 = 90 | 45 | 0 | -45 | -90;

export interface ShedRoofCpe {
  H: number;
  L: number;
  I?: number;
  J?: number;
  Ha?: number;
  La?: number;
  Hb?: number;
  Lb?: number;
}

const CE_90 = {
  HI: [-1.0, -1.0, -0.9, -0.8, -0.7, -0.5],
  LJ: [-0.5, -0.5, -0.5, -0.5, -0.5, -0.5],
};

const CE_45 = {
  H: [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
  L: [-0.9, -0.8, -0.7, -0.6, -0.6, -0.6],
};

const CE_0 = {
  HLa: [-1.0, -1.0, -1.0, -0.9, -0.8, -0.8], // até profundidade b/2
  HLb: [-0.5, -0.5, -0.5, -0.5, -0.5, -0.5], // de b/2 até a/2
};

const CE_MINUS_45 = {
  H: [-0.9, -0.8, -0.6, -0.5, -0.3, -0.1],
  L: [-1.0, -1.0, -1.0, -1.0, -0.9, -0.6],
};

const CE_MINUS_90 = {
  HI: [-0.5, -0.4, -0.3, -0.2, -0.1,  0.0],
  LJ: [-1.0, -1.0, -1.0, -1.0, -0.9, -0.6],
};

function interp(values: readonly number[], theta: number): number {
  return Number(linearInterp1D(THETA, [...values], theta).toFixed(2));
}

export function getShedRoofCpeNBR6123(theta: number, windAngle: WindAngleT8): ShedRoofCpe {
  const t = Math.max(THETA[0], Math.min(THETA[THETA.length - 1], theta));

  switch (windAngle) {
    case 90: {
      const hi = interp(CE_90.HI, t);
      const lj = interp(CE_90.LJ, t);
      return { H: hi, I: hi, L: lj, J: lj };
    }
    case 45: {
      return { H: interp(CE_45.H, t), L: interp(CE_45.L, t) };
    }
    case 0: {
      const hla = interp(CE_0.HLa, t);
      const hlb = interp(CE_0.HLb, t);
      // Retornamos Ha/La para profundidade até b/2, Hb/Lb para o resto.
      return { H: hla, L: hla, Ha: hla, La: hla, Hb: hlb, Lb: hlb };
    }
    case -45: {
      return { H: interp(CE_MINUS_45.H, t), L: interp(CE_MINUS_45.L, t) };
    }
    case -90: {
      const hi = interp(CE_MINUS_90.HI, t);
      const lj = interp(CE_MINUS_90.LJ, t);
      return { H: hi, I: hi, L: lj, J: lj };
    }
  }
}