/*
  A passagem do login com o Google para o dominio proprio da loja.

  O Google so devolve no endereco principal (ktalogu.com.br), o unico
  autorizado no Supabase. Numa loja com dominio proprio o cliente voltava
  logado la, longe do carrinho, que mora no navegador, no dominio da loja: a
  finalizacao abria vazia e, de volta a loja, o login era pedido de novo.

  Agora o endereco principal entrega uma passagem de uso unico ao dominio da
  loja (migration 163), que abre a sessao la. Aqui ficam as regras puras do
  caminho; o banco confere o resto (dominio verificado da loja, validade de
  2 minutos, uso unico e o vinculo com o navegador que comecou o login).
*/

/* O segredo que a loja grava no proprio dominio antes de ir ao Google. A
   passagem so abre a sessao no navegador que tem este cookie. */
export const COOKIE_DO_VINCULO = "ks_portal_vinculo";

const HOST_LOCAL = /^(localhost|127\.0\.0\.1)$|\.localhost$/i;

/* A origem de onde o cliente saiu para o Google: so protocolo e host, https
   fora da maquina de quem programa. Qualquer outra coisa e recusada. */
export function origemDaLoja(valor: unknown): { origem: string; dominio: string } | null {
  const texto = String(valor ?? "").trim();
  if (!texto || texto.length > 300) return null;
  let url: URL;
  try {
    url = new URL(texto);
  } catch {
    return null;
  }
  if (url.username || url.password) return null;
  if (url.pathname !== "/" || url.search || url.hash) return null;
  const local = HOST_LOCAL.test(url.hostname);
  if (url.protocol !== "https:" && !(local && url.protocol === "http:")) return null;
  return { origem: url.origin, dominio: url.hostname.toLowerCase() };
}

/* O caminho de volta, sempre dentro da loja. No dominio proprio o caminho
   pode vir sem o slug ("/p/123", o endereco que o cliente ve); com ou sem,
   ele sai com o slug na frente, que o dominio proprio tambem atende. */
export function caminhoNaLoja(slug: string, valor: unknown): string {
  const padrao = `/${slug}/cliente`;
  const texto = String(valor ?? "").trim();
  if (!texto || texto.length > 500) return padrao;
  if (!texto.startsWith("/") || texto.startsWith("//") || texto.startsWith("/\\") || /[\r\n\t]/.test(texto)) {
    return padrao;
  }
  if (texto === `/${slug}` || texto.startsWith(`/${slug}/`) || texto.startsWith(`/${slug}?`)) return texto;
  return texto === "/" ? `/${slug}` : `/${slug}${texto}`;
}

/* O endereco, no dominio da loja, que troca a passagem pela sessao. */
export function enderecoDaPassagem(origem: string, codigo: string, caminho: string) {
  const url = new URL("/api/client-portal/session/bootstrap", origem);
  url.searchParams.set("passagem", codigo);
  url.searchParams.set("next", caminho);
  return url.toString();
}
