/**
 * Quanto uma fatia representa do todo, escrito em português.
 *
 * Existe porque a Visão Geral do Financeiro mostrava "Pix: 984,7% do total".
 * A fatia (cada meio de pagamento) somava TODO o histórico, e o todo usado na
 * divisão era só o recebido NO MÊS. Nenhum dos dois números estava errado
 * sozinho; errada era a divisão de um pelo outro.
 *
 * A regra que impede isso de voltar: a fatia e o todo têm de vir da MESMA
 * lista. Por isso quem chama passa o total já somado das fatias, e esta
 * função não sabe o que é mês nem histórico.
 */
export function parteDoTotal(fatia: number, total: number): string {
  const parte = Number(fatia);
  const todo = Number(total);

  /* Sem total não existe proporção. Mostrar "0%" diria que a fatia não pesa
     nada, o que é outra mentira; o travessão diz que não dá para calcular. */
  if (!Number.isFinite(parte) || !Number.isFinite(todo) || todo <= 0) return "—";

  const percentual = (parte / todo) * 100;
  return `${percentual.toLocaleString("pt-BR", { minimumFractionDigits: 1, maximumFractionDigits: 1 })}%`;
}

/**
 * A variação de um mês para o anterior, pronta para o cartão.
 *
 * O cartão "Recebido no Mês" da Visão Geral mostrou "+12%" em verde para toda
 * empresa, em todo mês, desde que foi escrito: era um valor fixo no código, e
 * vinha acompanhado de "Janeiro 2026" também fixo. Quem olhava lia que tinha
 * crescido 12%.
 *
 * Devolve `null` quando não dá para comparar — mês anterior zerado não tem
 * base para percentual, e inventar "+100%" seria outra mentira bonita.
 */
export function variacaoDoMes(atual: number, anterior: number): { value: string; isPositive: boolean } | null {
  const agora = Number(atual);
  const antes = Number(anterior);
  if (!Number.isFinite(agora) || !Number.isFinite(antes) || antes <= 0) return null;

  const variacao = ((agora - antes) / antes) * 100;
  /* Sem casa decimal no cartão: "+12,4%" pesa mais do que informa. */
  const arredondada = Math.round(variacao);
  const sinal = arredondada > 0 ? "+" : "";
  return { value: `${sinal}${arredondada}%`, isPositive: arredondada >= 0 };
}

/**
 * A janela do mês anterior que se compara com o mês em curso.
 *
 * NÃO é o mês anterior inteiro. No dia 16, o mês atual tem 16 dias de
 * recebimento; comparar isso com os 30 dias do mês passado mostra uma queda
 * que não existe — e no dia 1 mostraria quase -100% para qualquer empresa.
 * A comparação justa é com o MESMO PEDAÇO do mês anterior: do dia 1 até o
 * mesmo ponto do mês.
 *
 * Quando o mês anterior é mais curto (31 de março contra fevereiro), a janela
 * para no fim dele, e não invade o mês atual.
 */
export function janelaDoMesAnterior(agora: Date): { inicio: Date; fim: Date } {
  const inicioDoMes = new Date(agora.getFullYear(), agora.getMonth(), 1, 0, 0, 0, 0);
  const inicio = new Date(agora.getFullYear(), agora.getMonth() - 1, 1, 0, 0, 0, 0);
  const decorrido = agora.getTime() - inicioDoMes.getTime();
  const fim = new Date(Math.min(inicio.getTime() + decorrido, inicioDoMes.getTime()));
  return { inicio, fim };
}

/** "Setembro de 2026": o mês de uma data, como se escreve. */
export function nomeDoMes(data: Date): string {
  const texto = data.toLocaleDateString("pt-BR", { month: "long", year: "numeric" });
  return texto.charAt(0).toUpperCase() + texto.slice(1);
}

/** A soma das fatias: o único total contra o qual cada uma pode ser dividida. */
export function somaDasFatias(fatias: Array<{ amount?: number | null }> | null | undefined): number {
  return (fatias || []).reduce((soma, f) => soma + (Number(f?.amount) || 0), 0);
}
