/**
 * Efeitos de vizinhança — NBR 6123:2023, sec. 6.4
 *
 * Implementa o fator de vizinhança fᵥ para os três mecanismos:
 *  - efeito venturi (6.4.1)
 *  - deflexão vertical (6.4.2)
 *  - turbulência da esteira (6.4.3)
 *
 * Valores representativos (6.4.4) — apenas duas edificações altas vizinhas:
 *  - Coeficiente de arrasto / forma médio em paredes confrontantes:
 *      a/S = 1,0  → fᵥ = 1,3
 *      a/S ≥ 3,0  → fᵥ = 1,0
 *  - Coeficiente de forma / Cpe médio na cobertura:
 *      a/S ≤ 0,5  → fᵥ = 1,3
 */

export type NeighborhoodMechanism = 'venturi' | 'vertical-deflection' | 'wake-turbulence' | 'none';

export interface NeighborhoodInput {
  /** Razão a/S ou S/a conforme o caso */
  ratioAS: number;
  /** Local de aplicação: 'wall' (paredes confrontantes) ou 'roof' (cobertura) */
  location: 'wall' | 'roof';
}

export function computeNeighborhoodFactor(input: NeighborhoodInput): number {
  const { ratioAS, location } = input;
  if (location === 'wall') {
    if (ratioAS >= 3.0) return 1.0;
    if (ratioAS <= 1.0) return 1.3;
    return 1.3 - ((ratioAS - 1.0) / 2.0) * 0.3;
  }
  if (ratioAS >= 1.0) return 1.0;
  if (ratioAS <= 0.5) return 1.3;
  return 1.3 - ((ratioAS - 0.5) / 0.5) * 0.3;
}

export interface NeighborhoodEffectDescriptor {
  mechanism: NeighborhoodMechanism;
  fv: number;
  descricao: string;
}

export function describeNeighborhoodEffects(
  mechanisms: readonly NeighborhoodMechanism[],
  ratioAS: number,
): NeighborhoodEffectDescriptor[] {
  return mechanisms.map((m) => {
    switch (m) {
      case 'venturi':
        return {
          mechanism: m,
          fv: computeNeighborhoodFactor({ ratioAS, location: 'wall' }),
          descricao:
            'Efeito Venturi: aceleração do escoamento entre edificações próximas. Pode produzir Cpe < −2,0.',
        };
      case 'vertical-deflection':
        return {
          mechanism: m,
          fv: computeNeighborhoodFactor({ ratioAS, location: 'wall' }),
          descricao:
            'Deflexão vertical do vento pela fachada da edificação alta, com aumento de velocidade próximo ao solo.',
        };
      case 'wake-turbulence':
        return {
          mechanism: m,
          fv: computeNeighborhoodFactor({ ratioAS, location: 'wall' }),
          descricao:
            'Turbulência na esteira a sotavento — pode induzir efeitos dinâmicos significativos em coberturas leves.',
        };
      case 'none':
      default:
        return { mechanism: 'none', fv: 1.0, descricao: 'Sem efeito de vizinhança relevante.' };
    }
  });
}