/**
 * Quanto custa uma hora de máquina e uma hora de trabalho.
 *
 * Espelho das funções `custo_hora_de_maquina` e `custo_hora_de_trabalho` do
 * banco, para a tela mostrar o resultado enquanto a pessoa digita. O banco
 * continua sendo quem grava — aqui é só a prévia, e o teste ao lado compara as
 * duas contas nos mesmos casos.
 *
 * O motivo de existir: 37 das 118 máquinas e 14 dos 59 cargos estão sem valor
 * de hora. Não é desleixo — ninguém sabe de cabeça quanto custa uma hora da sua
 * impressora. Perguntar o que a pessoa sabe (quanto pagou, quantos anos dura,
 * quanto roda por mês) e fazer a conta é a diferença entre um campo vazio e um
 * número em que ela confia.
 */

const numero = (v: unknown): number => {
  const n = Number(v);
  return Number.isFinite(n) ? n : 0;
};

export function custoHoraDeMaquina(dados: {
  valorDeCompra?: unknown;
  vidaUtilAnos?: unknown;
  valorResidual?: unknown;
  potenciaKw?: unknown;
  custoKwh?: unknown;
  manutencaoMensal?: unknown;
  horasProdutivasMes?: unknown;
}): number | null {
  const horas = numero(dados.horasProdutivasMes);
  /* Sem horas produtivas nao ha divisor, e chutar um faria a tela mostrar um
     numero inventado com cara de calculado. */
  if (horas <= 0) return null;

  const vida = numero(dados.vidaUtilAnos);
  const depreciacaoMensal =
    vida > 0
      ? Math.max(numero(dados.valorDeCompra) - numero(dados.valorResidual), 0) / (vida * 12)
      : 0;

  const porHora = (depreciacaoMensal + numero(dados.manutencaoMensal)) / horas;
  const energiaPorHora = numero(dados.potenciaKw) * numero(dados.custoKwh);

  return Math.round((porHora + energiaPorHora) * 100) / 100;
}

export function custoHoraDeTrabalho(dados: {
  salarioMensal?: unknown;
  encargosPct?: unknown;
  horasProdutivasMes?: unknown;
  /* Quanto do tempo pago vira produção de verdade. 80% encarece a hora útil
     em 25%: o salário é o mesmo, mas rende menos horas que produzem. Ausente
     ou inválida, vale 100 — o comportamento de sempre. */
  eficienciaPct?: unknown;
}): number | null {
  const horas = numero(dados.horasProdutivasMes);
  if (horas <= 0) return null;

  const eficienciaInformada = numero(dados.eficienciaPct);
  const eficiencia = eficienciaInformada > 0 && eficienciaInformada <= 100 ? eficienciaInformada : 100;
  const horasQueProduzem = horas * (eficiencia / 100);

  const comEncargos = numero(dados.salarioMensal) * (1 + numero(dados.encargosPct) / 100);
  return Math.round((comEncargos / horasQueProduzem) * 100) / 100;
}
