/**
 * Casos clássicos resolvidos do livro "O Vento na Engenharia Estrutural"
 * (J. Blessmann, EDUFRGS, 2ª ed.) — M9.9
 *
 * Estes casos são usados como benchmark de validação cruzada para
 * verificar que os cálculos do VentoApp batem com a referência
 * bibliográfica padrão da Engenharia Estrutural Brasileira.
 *
 * Cada caso documenta:
 *  - Dados de entrada (geometria, vento, terreno)
 *  - Resultados esperados com a fonte (capítulo ou equação)
 *  - Tolerância admitida (Δ% ou Δ absoluto)
 *
 * ⚠️ Valores baseados na edição 2011 da NBR 6123; pequenas diferenças
 * com a edição 2023 (M9.1) podem existir em casas raras — ver notas
 * em cada caso.
 */

import type { TerrainCategory } from './wind-kernel';

/** Estrutura comum a todos os casos de validação. */
export interface BlessmannCase {
  /** Identificador único (capítulo ou exemplo do livro) */
  id: string;
  /** Descrição sucinta do cenário */
  description: string;
  /** Fonte no livro (capítulo/exemplo) */
  source: string;
  /** Tolerância admitida (fração, ex. 0.01 = 1%) */
  tolerance: number;
  /** Notas sobre o caso (diferenças entre edições, arredondamentos) */
  notes?: string;
}

// =============================================================================
// CASO 1: Exemplo clássico do Capítulo 5 (Blessmann)
// Galpão industrial — vento 0° e 90°
// =============================================================================
/**
 * Galpão retangular 30 × 15 × 6 m (a × b × h), cobertura duas águas θ = 10°,
 * vento V₀ = 40 m/s, Cat. II, S₁ = 1, S₃ = 1.
 *
 * Esperado:
 *  - S₂(10m, II, A) = 1,00 (classe A: maior dimensão ≤ 20 m)
 *  - Vₖ = 40 × 1 × 1 × 1 = 40 m/s
 *  - q = 0,613 × 40² / 1000 = 0,981 kN/m²
 *  - Para vento 0°: h/b = 0,4; a/b = 2,0
 *      Cpe A = -1,1 (vértice barlavento, sucção)
 *      Cpe B = -0,8 (zona central lateral)
 *      Cpe C = +0,7 (barlavento principal, pressão)
 *      Cpe D = -0,4 (sotavento)
 *      Cpe E = -1,0 (telhado zona E — barlavento alta sucção)
 */
export const CASE_GALPAO_30x15x6: BlessmannCase = {
  id: 'galpao-30x15x6-0deg',
  description: 'Galpão 30×15×6 m, telhado duas águas θ=10°, vento 0°',
  source: 'Blessmann Cap. 5, Exemplo 5.1 (adaptação)',
  tolerance: 0.05,
  notes: 'Valores arredondados para 1 casa decimal conforme Tab. 6.',
};

// =============================================================================
// CASO 2: Exemplo de vento em edifício alto (Cap. 9)
// =============================================================================
/**
 * Edifício 60 × 20 × 100 m (a × b × h), Cat. III, S₃ grupo 3 (S₃ = 1).
 *
 * Esperado:
 *  - Classe C (maior dimensão > 50 m)
 *  - S₂(100 m, III, C) ≈ 1,15
 *  - Vₖ = 40 × 1 × 1,15 × 1 = 46 m/s
 *  - q(100m) ≈ 1,30 kN/m²
 */
export const CASE_EDIFICIO_ALTO_60x20x100: BlessmannCase = {
  id: 'edificio-60x20x100',
  description: 'Edifício alto 60×20×100 m, Cat. III',
  source: 'Blessmann Cap. 9 (efeitos dinâmicos)',
  tolerance: 0.03,
};

// =============================================================================
// CASO 3: Reservatório cilíndrico (Tab. 13)
// =============================================================================
/**
 * Silo cilíndrico vertical, d = 8 m, h = 24 m, superfície lisa, topo
 * aberto, vento V₀ = 35 m/s, Cat. II.
 *
 * Esperado:
 *  - h/d = 24/8 = 3 → comportamento próximo a h/d ≥ 2,5 (Tabela 13 usa
 *    coluna "h/d ≥ 2,5")
 *  - Re = 70 000 × 35 × 8 = 19,6 × 10⁶ (supercrítico)
 *  - Para cilindro liso em θ = 0°: Cpe ≈ -1,0 (sotavento); ≈ +1,0 (barlavento)
 *    Nota: valores reais dependem da interpolação fina, aqui usamos a
 *    referência simplificada do Blessmann.
 *  - Cpi para topo aberto (h/d ≥ 0,3): Cpi = -0,8
 */
export const CASE_SILO_CILINDRICO: BlessmannCase = {
  id: 'silo-cilindrico-d8-h24',
  description: 'Silo cilíndrico d=8m, h=24m, liso, topo aberto',
  source: 'Blessmann Cap. 6 (Tabela 13 e Fig. 16)',
  tolerance: 0.15,
  notes: 'Tolerância mais ampla por causa de interpolação fina entre chaves da Tabela 13.',
};

// =============================================================================
// CASO 4: S₂ em diferentes categorias e alturas (Tab. 3, Anexo A)
// =============================================================================
/**
 * Variação de S₂ com altura e categoria — conferência dos valores tabelados.
 *
 * h=10 m, Cat. II, Classe A: S₂ = 1,00
 * h=30 m, Cat. III, Classe B: S₂ ≈ 1,03
 * h=100 m, Cat. V, Classe C: S₂ ≈ 1,01 (saturação)
 *
 * Fonte: NBR 6123:2023 Tab. 3
 */
export const CASE_S2_TAB3: BlessmannCase = {
  id: 's2-tabela-3',
  description: 'S₂ em diferentes (h, categoria, classe)',
  source: 'NBR 6123:2023 Tab. 3',
  tolerance: 0.02,
};

// =============================================================================
// CASO 5: S₃ analítico por Pₘ e vida útil (Anexo B)
// =============================================================================
/**
 * Cálculo analítico de S₃ conforme fórmula do Anexo B:
 *   S₃ = 0,54 · (-ln(1 - Pₘ))^(-1/7) · m^(1/7)
 *
 * Casos:
 *  - Pₘ = 0,63, m = 50 anos: S₃ = 1,00 (referência)
 *  - Pₘ = 0,10, m = 50 anos: S₃ ≈ 1,42
 *  - Pₘ = 0,63, m = 2 anos: S₃ ≈ 0,60
 */
export const CASE_S3_ANALITICO: BlessmannCase = {
  id: 's3-analitico-anexo-b',
  description: 'S₃ via fórmula analítica do Anexo B',
  source: 'NBR 6123:2023 Anexo B',
  tolerance: 0.02,
};

// =============================================================================
// CASO 6: Vento em ponte — Pse (Cap. 11)
// =============================================================================
/**
 * Ponte com vão Lₚ = 120 m, largura B = 14 m, altura do tabuleiro z = 15 m,
 * Cat. II, S₁ = 1, V₀ = 40 m/s.
 *
 * Esperado:
 *  - Vₖ(15m, II, A) ≈ 40 m/s
 *  - V_it = 0,65 × 40 × 1 × 1 × (15/10)^0,10 ≈ 26,5 m/s
 *  - ρ = 1,226 kg/m³
 *  - f_v = 0,6 Hz, m = 18000 kg/m → Pse ≈ ρ·V_it² / (m·f_v²) ≈ 1,226 × 26,5² / (18000 × 0,36) ≈ 0,13
 *  - Classe 2 (efeitos dinâmicos devem ser avaliados)
 */
export const CASE_PONTE_120m: BlessmannCase = {
  id: 'ponte-120m-pse',
  description: 'Ponte 120m vão, tabuleiro 14m de largura',
  source: 'NBR 6123:2023 sec. 11.2.2',
  tolerance: 0.10,
};

// =============================================================================
// CASO 7: Cobertura isolada (Tab. 24)
// =============================================================================
/**
 * Cobertura isolada a duas águas, θ = 15°, profundidade b = 6 m, altura
 * livre h = 1,5 m. Vento V₀ = 35 m/s, Cat. II.
 *
 * Para 0,07 ≤ tg(15°) = 0,268 ≤ 0,4 → Carregamento 1 aplica.
 * Para h ≤ tg(θ)·b/2 = 0,268 × 6 / 2 = 0,80 m: limite OK (h = 1,5 > 0,80).
 * Portanto caso NÃO aplica (limite excedido).
 */
export const CASE_COBERTURA_ISOLADA: BlessmannCase = {
  id: 'cob-isolada-limite',
  description: 'Verificação de limites para cobertura isolada',
  source: 'NBR 6123:2023 sec. 7.2.1 (Tabela 25)',
  tolerance: 0.0,
};

// =============================================================================
// CASO 8: Reynolds e Cpe em cilindro (Blessmann Cap. 6, Tab. 13)
// =============================================================================
/**
 * Cilindro de chaminé d = 1,5 m, h = 30 m, superfície lisa, vento V₀ = 40 m/s,
 * Cat. II. Avaliar Cpe em θ = 0°, 90°, 180° com Re = 70 000 × 40 × 1,5 = 4,2×10⁶.
 *
 * Para h/d = 20 ≥ 2,5, liso: Cpe(0°) = +1,0; Cpe(90°) = -1,0; Cpe(180°) = -0,4
 * (valores aproximados da Tab. 13 para liso, h/d ≥ 2,5).
 */
export const CASE_CHAMINE_CILINDRO: BlessmannCase = {
  id: 'chamine-d1.5-h30',
  description: 'Chaminé d=1.5m, h=30m, liso',
  source: 'NBR 6123:2023 Tab. 13 (regime supercrítico)',
  tolerance: 0.20,
  notes: 'Tolerância ampla por interpolação bilinear entre chaves.',
};

// =============================================================================
// CASO 9: Vento em muro/placa (Cap. 7, Tab. 23)
// =============================================================================
/**
 * Placa de publicidad: ℓ = 6 m, hₐ = 2 m, α = 90°, sem placas de extremidade.
 *
 * Esperado para ℓ/hₐ = 3 (entre 10 e 60):
 *  - Para α = 90°, sem placas: C_f ≈ 1,2 + 0,03·(ℓ/hₐ) ≈ 1,2
 *    (interpolação entre ℓ/hₐ = 1 (C_f=1,2) e ℓ/hₐ = 10 (C_f=1,2))
 *  - Cf ≈ 1,2 (regime 2D)
 */
export const CASE_PLACA_PUBLICIDADE: BlessmannCase = {
  id: 'placa-publicidade-6x2',
  description: 'Placa 6×2 m sem placas de extremidade',
  source: 'NBR 6123:2023 Tab. 23 (muro/placa)',
  tolerance: 0.15,
};

// =============================================================================
// CASO 10: S₂ via fórmula teórica vs tabela (M9.1 cross-check)
// =============================================================================
/**
 * Comparação S₂(tabela) vs S₂(fórmula teórica):
 * S₂ = b · Fᵣ · (z/10)^p
 *
 * Para z = 30 m, Cat. II, Classe A (maior dimensão ≤ 20):
 *  - b = 1,00, Fᵣ = 1,00, p = 0,085
 *  - S₂(fórmula) = 1,00 × 1,00 × (30/10)^0,085 = 3^0,085 ≈ 1,099
 *  - S₂(tabela) = 1,10 (lido da Tab. 3)
 */
export const CASE_S2_FORMULA_VS_TABELA: BlessmannCase = {
  id: 's2-formula-vs-tabela',
  description: 'S₂ fórmula teórica vs Tabela 3 (consistência)',
  source: 'NBR 6123:2023 Tab. 1 + Tab. 3',
  tolerance: 0.005,
  notes: 'Diferença < 0,5% esperada (mesma fórmula).',
};

// =============================================================================
// Lista consolidada
// =============================================================================
export const BLESSMANN_CASES = {
  CASE_GALPAO_30x15x6,
  CASE_EDIFICIO_ALTO_60x20x100,
  CASE_SILO_CILINDRICO,
  CASE_S2_TAB3,
  CASE_S3_ANALITICO,
  CASE_PONTE_120m,
  CASE_COBERTURA_ISOLADA,
  CASE_CHAMINE_CILINDRO,
  CASE_PLACA_PUBLICIDADE,
  CASE_S2_FORMULA_VS_TABELA,
} as const;

// =============================================================================
// Helpers para os testes
// =============================================================================

/**
 * Compara valor calculado com esperado dentro de tolerância.
 */
export function isWithinTolerance(calculated: number, expected: number, tolerance: number): boolean {
  if (expected === 0) return Math.abs(calculated) <= tolerance;
  return Math.abs((calculated - expected) / expected) <= tolerance;
}

/**
 * Calcula S₂ via fórmula teórica e compara com valor tabelado.
 * Usado no CASO 10.
 */
export function s2FormulaFromBFR(
  b: number,
  fr: number,
  z: number,
  p: number,
): number {
  return Number((b * fr * Math.pow(z / 10, p)).toFixed(3));
}

/**
 * Tipo exportado para reuso em testes.
 */
export type Category = TerrainCategory;