/**
 * Tabela 21 — Cúpulas sobre o terreno (NBR 6123:2023, sec. 6.2.4.1).
 *
 * Valores limites de Cpe (sobrepressão e sucção) e coeficiente de
 * sustentação Cs por f/d.
 *
 * Fonte: NBR 6123:2023, p. 40 (Tabela 21).
 * Última auditoria: 2026-07-07 — valores oficiais do PDF confirmados.
 *
 * Chaves: f/d (razão flecha/diâmetro). A norma fornece chaves literais
 * "1/15", "1/10", "1/8", "1/6", "1/4", "1/2".
 *
 * ⚠️ CORREÇÃO: Sobrepressão é POSITIVA (sopramento sobre a cúpula).
 * O código anterior usava valores negativos incorretamente.
 */

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

const FD = [1 / 15, 1 / 10, 1 / 8, 1 / 6, 1 / 4, 1 / 2] as const;
const FD_KEYS = ['1/15', '1/10', '1/8', '1/6', '1/4', '1/2'] as const;

type Row = { sobrepressao: number; sucção: number; cs: number };

/**
 * Valores oficiais da Tabela 21 — NBR 6123:2023, p. 40.
 * Sobrepressão é POSITIVA (sinal + na norma).
 */
const T21: Record<string, Row> = {
  '1/15': { sobrepressao: +0.1, sucção: -0.3, cs: 0.15 },
  '1/10': { sobrepressao: +0.2, sucção: -0.3, cs: 0.20 },
  '1/8':  { sobrepressao: +0.2, sucção: -0.4, cs: 0.20 },
  '1/6':  { sobrepressao: +0.3, sucção: -0.5, cs: 0.30 },
  '1/4':  { sobrepressao: +0.4, sucção: -0.6, cs: 0.30 },
  '1/2':  { sobrepressao: +0.6, sucção: -1.0, cs: 0.50 },
};

function lookup21(fd: number): Row {
  const fdClamped = Math.max(FD[0], Math.min(FD[FD.length - 1], fd));
  const xs = [...FD];
  const ys1 = FD_KEYS.map((k) => T21[k].sobrepressao);
  const ys2 = FD_KEYS.map((k) => T21[k].sucção);
  const ys3 = FD_KEYS.map((k) => T21[k].cs);
  return {
    sobrepressao: Number(linearInterp1D(xs, ys1, fdClamped).toFixed(2)),
    sucção: Number(linearInterp1D(xs, ys2, fdClamped).toFixed(2)),
    cs: Number(linearInterp1D(xs, ys3, fdClamped).toFixed(2)),
  };
}

export interface DomeCpeResult {
  /** Cpe máximo (sobrepressão) — positivo para cúpulas sobre o terreno */
  cpeMax: number;
  /** Cpe mínimo (sucção) */
  cpeMin: number;
  /** Coeficiente de sustentação */
  cs: number;
}

export function getDomeOnGroundCpeNBR6123(fOverD: number): DomeCpeResult {
  const v = lookup21(fOverD);
  return { cpeMax: v.sobrepressao, cpeMin: v.sucção, cs: v.cs };
}

/** Força de sustentação F = Cs · q · (π·d²/4) */
export function getDomeLiftForce(cs: number, q: number, d: number): number {
  return Number((cs * q * (Math.PI * d * d) / 4).toFixed(3));
}

// Mantém compatibilidade com o nome anterior (chaves literais)
export const DOME_FD_KEYS = FD_KEYS;
