/*
  Formatação de números do template Vendor.

  Existe só para o Vendor não precisar importar nada de formatação dos outros
  templates. É pouca coisa e duplicada de propósito: a regra do projeto é que
  um template não dependa do outro nem para dinheiro.
*/

export function moedaDoVendor(valor: number) {
  const numero = Number.isFinite(Number(valor)) ? Number(valor) : 0;
  return numero.toLocaleString("pt-BR", { style: "currency", currency: "BRL" });
}

export function numeroDoVendor(valor: number, casas = 0) {
  const numero = Number.isFinite(Number(valor)) ? Number(valor) : 0;
  return numero.toLocaleString("pt-BR", { minimumFractionDigits: casas, maximumFractionDigits: casas });
}

/**
 * O prazo de produção em português, do jeito que o cliente lê.
 *
 * Escrito aqui, e não importado, porque o Vendor não depende de nenhum outro
 * template nem para uma frase.
 */
export function prazoDoVendor(
  valor: number | null | undefined,
  unidade: "hours" | "days" | "business_days" | "weeks" | null | undefined
) {
  const numero = Number(valor);
  if (!Number.isFinite(numero) || numero <= 0) return null;
  const arredondado = Number.isInteger(numero) ? numero : Math.round(numero * 10) / 10;
  const um = arredondado === 1;
  const rotulo =
    unidade === "hours"
      ? um
        ? "hora"
        : "horas"
      : unidade === "days"
        ? um
          ? "dia corrido"
          : "dias corridos"
        : unidade === "weeks"
          ? um
            ? "semana"
            : "semanas"
          : um
            ? "dia útil"
            : "dias úteis";
  return `${arredondado.toLocaleString("pt-BR")} ${rotulo}`;
}

/**
 * Quando a peça fica pronta, contando a partir de hoje.
 *
 * Dias úteis pulam sábado e domingo. É uma previsão de produção, não de
 * entrega: o frete é somado depois, pela cotação.
 */
export function previsaoDoVendor(
  valor: number | null | undefined,
  unidade: "hours" | "days" | "business_days" | "weeks" | null | undefined
) {
  const numero = Number(valor);
  if (!Number.isFinite(numero) || numero <= 0) return null;

  const data = new Date();
  if (unidade === "hours") {
    data.setHours(data.getHours() + numero);
  } else if (unidade === "days") {
    data.setDate(data.getDate() + Math.ceil(numero));
  } else if (unidade === "weeks") {
    data.setDate(data.getDate() + Math.ceil(numero) * 7);
  } else {
    let restam = Math.ceil(numero);
    while (restam > 0) {
      data.setDate(data.getDate() + 1);
      const diaDaSemana = data.getDay();
      if (diaDaSemana !== 0 && diaDaSemana !== 6) restam -= 1;
    }
  }
  return data.toLocaleDateString("pt-BR");
}
