import { describe, it, expect } from 'vitest';
import {
  calculateShelterWind,
  calculateShelterWindAllAngles,
  type ShelterInput,
} from '../nbr-tables/table-shelters';

describe('NBR 6123 - Ações de Vento em Abrigos e Pórticos (table-shelters)', () => {
  const baseInput: ShelterInput = {
    condition: 'cond1',
    depth: 6,
    width: 10,
    height: 4.8,
    theta: 5,
    backClosure: 100,
    leftClosure: 100,
    rightClosure: 100,
    openingPos: 'distributed',
  };

  it('calcula corretamente o abrigo para incidência frontal a 0°', () => {
    const res = calculateShelterWind({ ...baseInput, windAngle: 0 }, 1.0);
    expect(res.windAngle).toBe(0);
    expect(res.cpeTop).toBe(-1.0);
    expect(res.cpiBottom).toBe(0.75);
    expect(res.cnfVertical).toBe(-1.75);
    expect(res.cfBack).toBe(1.3);
    expect(res.cfSide).toBe(0.9);
  });

  it('calcula corretamente o abrigo para incidência oblíqua a 45° com vórtice crítico de canto', () => {
    const res = calculateShelterWind({ ...baseInput, windAngle: 45 }, 1.0);
    expect(res.windAngle).toBe(45);
    expect(res.cpeTop).toBe(-1.3); // picos de sucção de canto
    expect(res.cfBack).toBe(1.05);
    expect(res.cfSide).toBe(1.05);
  });

  it('calcula corretamente o abrigo para incidência lateral a 90°', () => {
    const res = calculateShelterWind({ ...baseInput, windAngle: 90 }, 1.0);
    expect(res.windAngle).toBe(90);
    expect(res.cpeTop).toBe(-1.1);
    expect(res.cfSide).toBe(1.3); // lateral atua como parede barlavento frontal
  });

  it('calcula a envoltória de todas as 3 direções (0°, 45°, 90°)', () => {
    const env = calculateShelterWindAllAngles(baseInput, 1.0);
    expect(env.res0.windAngle).toBe(0);
    expect(env.res45.windAngle).toBe(45);
    expect(env.res90.windAngle).toBe(90);
    expect(env.criticalUp.value).toBeGreaterThan(0);
    expect(env.criticalFx.angle).toBe(0); // 0° é crítico para FxBack em cond1
    expect(env.criticalFy.angle).toBe(90); // 90° é crítico para FySide em cond1
  });
});
