/**
 * Avaliação de conforto humano (NBR 6123:2023, sec. 9.6).
 *
 * Aceleração-limite:
 *   a_lim = 0,01 · k_a · f^1.124  (m/s²)
 *
 * onde k_a = 6,12 (escritórios) ou 4,058 (residências).
 */

export interface ComfortInput {
  /** Frequência de vibração f (Hz) */
  freq: number;
  /** Aceleração máxima a_max (m/s²) — calculada pelo usuário */
  aMax: number;
  /** Tipo de uso */
  use: 'residential' | 'commercial';
}

export interface ComfortResult {
  aLim: number;
  use: 'residential' | 'commercial';
  ok: boolean;
  ratio: number;
  description: string;
}

export function evaluateComfort(input: ComfortInput): ComfortResult {
  const { freq, aMax, use } = input;
  if (freq < 0.06 || freq > 1) {
    return {
      aLim: 0,
      use,
      ok: false,
      ratio: 0,
      description: 'Fora da faixa 0,06–1,00 Hz — aplicar critério da ISO 10137.',
    };
  }
  const ka = use === 'commercial' ? 6.12 : 4.058;
  const aLim = Number((0.01 * ka * Math.pow(freq, 1.124)).toFixed(3));
  const ratio = Number((aMax / aLim).toFixed(3));
  return {
    aLim,
    use,
    ok: aMax <= aLim,
    ratio,
    description: aMax <= aLim
      ? `Aceleração dentro do limite (a/a_lim = ${ratio}).`
      : `Aceleração acima do limite (a/a_lim = ${ratio}).`,
  };
}

/** Aceleração máxima a_max = 4π²f²·u_max (sec. 9.6.1) */
export function maxAcceleration(freq: number, uMax: number): number {
  return Number((4 * Math.PI * Math.PI * freq * freq * uMax).toFixed(3));
}