/**
 * Tabela 29 — Coeficiente de arrasto Ca para fios e cabos com ℓ/d' > 60
 * (NBR 6123:2023, sec. 8.2).
 *
 * Varia com Re = 70 000 · Vk · d.
 *
 * Fonte: NBR 6123:2023, p. 54 (Tabela 29).
 * Última auditoria: 2026-07-07 — ⚠️ PENDENTE: revisar valores por
 *   acabamento e regime.
 */

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

export type CableFinish = 'fio-liso' | 'galvanizado' | 'fios-finos' | 'cabos-grossos';

interface CaByRe {
  reMin: number;
  reMax: number;
  /** Ca por tipo de acabamento */
  ca: Record<CableFinish, number>;
}

const CA_T29: CaByRe[] = [
  { reMin: 0, reMax: 2.5e4, ca: { 'fio-liso': 1.0, galvanizado: 1.2, 'fios-finos': 1.3, 'cabos-grossos': 1.3 } },
  { reMin: 2.5e4, reMax: 4.2e5, ca: { 'fio-liso': 1.0, galvanizado: 0.9, 'fios-finos': 1.1, 'cabos-grossos': 1.1 } },
  { reMin: 4.2e5, reMax: 1.25e5, ca: { 'fio-liso': 1.2, galvanizado: 1.2, 'fios-finos': 1.0, 'cabos-grossos': 1.0 } },
  { reMin: 1.25e5, reMax: 4.2e5, ca: { 'fio-liso': 0.5, galvanizado: 0.6, 'fios-finos': 0.6, 'cabos-grossos': 0.6 } },
];

export function getCableDragCoefficient(re: number, finish: CableFinish): number {
  for (const row of CA_T29) {
    if (re >= row.reMin && re < row.reMax) return row.ca[finish];
  }
  return 1.0;
}

/** Força perpendicular à corda: F = Ca · q · d · ℓ (kN) */
export function calculateCableForce(ca: number, q: number, d: number, length: number): number {
  return Number((ca * q * d * length).toFixed(3));
}

/** Componente perpendicular à corda para vento a ângulo α: F_y = F · sin(α) */
export function cableForcePerpendicular(totalForce: number, alphaDeg: number): number {
  return Number((totalForce * Math.sin((alphaDeg * Math.PI) / 180)).toFixed(3));
}

/** Diâmetro equivalente do cabo com n fios de diâmetro d_f (helicoidais): d_eq = d + 2·d_f */
export function equivalentCableDiameter(d: number, wireDiameter: number): number {
  return d + 2 * wireDiameter;
}

/** Helper para interpolar quando há um valor contínuo desejado (não utilizado no básico) */
export const _unused: typeof linearInterp1D = linearInterp1D;