/*
  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();
}

/*
  O endereco de volta do Google escrito como o Supabase aceita. Na lista de
  enderecos permitidos do Supabase o "*" nao passa por ponto nem por barra; a
  barra o navegador ja escreve como %2F na busca, o ponto nao. A origem da loja
  em dominio proprio ("https://espiaelasatelier.com.br") tem ponto: o Supabase
  recusava o retorno e mandava o cliente para o endereco padrao dele
  (admin.ktalogu.com.br, o login do painel). Medido em 02/11/2026: "slug=a.b"
  recusado, "slug=a%2Eb" aceito. Na busca, o ponto vai como %2E e a barra como
  %2F; quem le o retorno recebe os dois de volta (URLSearchParams decodifica).
*/
export function retornoQueOSupabaseAceita(url: URL): string {
  const texto = url.toString();
  const busca = texto.indexOf("?");
  if (busca < 0) return texto;
  return texto.slice(0, busca) + texto.slice(busca).replace(/\./g, "%2E").replace(/\//g, "%2F");
}
