/*
 * As regras puras da fila dos produtos digitais (lib/digitais/servidor/fila.ts):
 * quando tentar de novo, de que lojas cuidar e onde a loja atende.
 */

/* Espera antes da próxima tentativa, pela tentativa que acabou de falhar:
   1 min, 5 min, 30 min, 2 h e 12 h. Depois disso, desiste. */
const ESPERAS_MIN = [1, 5, 30, 120, 720];
export const MAX_TENTATIVAS = ESPERAS_MIN.length + 1;

export function esperaDaTentativa(tentativas: number): number | null {
  if (!Number.isFinite(tentativas) || tentativas >= MAX_TENTATIVAS) return null;
  return ESPERAS_MIN[Math.max(0, Math.min(ESPERAS_MIN.length - 1, Math.floor(tentativas) - 1))];
}

const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;

/**
 * De que lojas a fila cuida. `null` = todas (produção); lista = só essas;
 * `false` = desligada.
 *
 * O banco é um só para o computador de desenvolvimento e a produção: fora de
 * produção a fila só liga com DIGITAIS_FILA_LOCAL e só mexe nas lojas de
 * DIGITAIS_LIBERADOS (as de teste). Com `todas` ou vazia, fica desligada.
 *
 * A liberação pelo banco (`digitais_ajustes`, migration 193) não entra aqui de
 * propósito: em produção a fila já cuida de todas as lojas (e assim também das
 * liberadas pelo banco); no computador, as linhas do banco são de empresas
 * reais, e a fila local nunca deve mexer nelas.
 */
export function lojasDaFila(env: Record<string, string | undefined>): string[] | null | false {
  if (env.NODE_ENV === "production") return null;
  if (!String(env.DIGITAIS_FILA_LOCAL || "").trim()) return false;
  const lista = String(env.DIGITAIS_LIBERADOS || "")
    .split(/[\s,;]+/)
    .map((id) => id.trim().toLowerCase())
    .filter((id) => UUID.test(id));
  return lista.length ? Array.from(new Set(lista)) : false;
}

/** Onde a loja atende quando não há uma requisição na mão (a fila roda sozinha). */
export function baseDaLojaSemPedido(
  loja: { slug: string | null; dominio: string | null },
  env: Record<string, string | undefined>
): string | null {
  const dominio = String(loja.dominio || "").trim().toLowerCase();
  if (dominio && /^[a-z0-9.-]+$/.test(dominio)) return `https://${dominio}`;
  const slug = String(loja.slug || "").trim();
  if (!slug) return null;
  const configurado = String(env.NEXT_PUBLIC_PUBLIC_CATALOG_BASE_URL || env.PUBLIC_CATALOG_BASE_URL || "")
    .trim()
    .replace(/\/+$/, "");
  const base = configurado || (env.NODE_ENV === "production" ? "https://ktalogu.com.br" : "http://localhost:3001");
  return `${base}/${encodeURIComponent(slug)}`;
}

/* "a, b e c" — e "a, b, c, d, e, f e mais 3" quando passa do teto. */
export function listaDeItens(titulos: string[], teto = 6): string {
  const unicos = Array.from(new Set(titulos.map((t) => String(t || "").trim()).filter(Boolean)));
  if (unicos.length > teto) return `${unicos.slice(0, teto).join(", ")} e mais ${unicos.length - teto}`;
  if (unicos.length <= 1) return unicos[0] ?? "";
  return `${unicos.slice(0, -1).join(", ")} e ${unicos[unicos.length - 1]}`;
}
