/*
  O endereço que o lojista digitou num banner, pronto para virar link.

  O campo é livre. Quem escreve "www.minhaloja.com.br/promo" sem o https://
  ganhava um link que o navegador lia como pasta da própria loja
  (/metra/www.minhaloja.com.br/promo) e caía em página não encontrada. Aqui o
  endereço sem protocolo ganha https://, o caminho da própria loja
  ("/metra/c/canecas") e a âncora ficam como estão, e o que não é endereço de
  página (javascript:, data:) não vira link.
*/

export type DestinoDoLink = {
  href: string;
  /* Fora da loja: vai em <a>, não no Link do Next. */
  externo: boolean;
};

export function destinoDoLink(bruto: unknown): DestinoDoLink | null {
  const texto = String(bruto ?? "").trim();
  if (!texto) return null;

  if (texto.startsWith("//")) return { href: `https:${texto}`, externo: true };
  if (/^[/#?]/.test(texto)) return { href: texto, externo: false };
  if (/^(https?:\/\/|mailto:|tel:)/i.test(texto)) return { href: texto, externo: true };

  /* "loja.com.br", "www.loja.com.br/promo", "wa.me/5581999999999". */
  if (/^[a-z0-9-]+(\.[a-z0-9-]+)+(:\d+)?([/?#]\S*)?$/i.test(texto)) {
    return { href: `https://${texto}`, externo: true };
  }

  /* Qualquer outro "protocolo:" (javascript:, data:, ftp:) não é página. */
  if (/^[a-z][a-z0-9+.-]*:/i.test(texto)) return null;

  /* Sobrou um caminho sem a barra ("metra/c/canecas"): é da própria loja.
     Frase solta não é endereço. */
  if (/\s/.test(texto)) return null;
  return { href: `/${texto}`, externo: false };
}
