/**
 * Endereço do compromisso: montar e desmontar.
 *
 * Saiu de dentro do formulario para ca por dois motivos. E funcao pura, entao
 * nao tinha o que fazer num componente de tela; e do jeito antigo nao dava
 * para testar sem carregar React inteiro junto.
 *
 * O formato do texto e o que vai para o banco e para o geocodificador. Mexer
 * nele quebra endereco ja salvo, entao os dois lados andam juntos: o que
 * `juntarEndereco` escreve, `partirEndereco` precisa conseguir ler de volta.
 */

export type Endereco = {
  rua: string;
  numero: string;
  complemento: string;
  bairro: string;
  cidade: string;
  uf: string;
};

export const ENDERECO_VAZIO: Endereco = {
  rua: "",
  numero: "",
  complemento: "",
  bairro: "",
  cidade: "",
  uf: "",
};

/* Monta no formato que o geocodificador entende melhor: logradouro e numero
   juntos, depois bairro, depois cidade e UF. O complemento fica de fora da
   parte principal — sala e andar nao ajudam a achar o ponto no mapa e so
   atrapalham a busca. */
export function juntarEndereco(e: Endereco) {
  const logradouro = [e.rua.trim(), e.numero.trim()].filter(Boolean).join(", ");
  const cidadeUf = [e.cidade.trim(), e.uf.trim()].filter(Boolean).join(" - ");
  const base = [logradouro, e.bairro.trim(), cidadeUf].filter(Boolean).join(", ");
  const compl = e.complemento.trim();
  return compl ? `${base} (${compl})` : base;
}

/* Desmonta o que ja estava salvo como texto corrido. E tolerante de proposito:
   endereco antigo veio de digitacao livre e nao segue formato nenhum, entao o
   que nao der para separar cai em "rua" e continua editavel — melhor um campo
   com texto demais do que um endereco perdido na migracao. */
export function partirEndereco(texto: string | null | undefined): Endereco {
  const bruto = String(texto || "").trim();
  if (!bruto) return { ...ENDERECO_VAZIO };

  const e: Endereco = { ...ENDERECO_VAZIO };

  const comCompl = bruto.match(/^(.*)\s*\(([^)]*)\)\s*$/);
  const semCompl = comCompl ? comCompl[1].trim() : bruto;
  if (comCompl) e.complemento = comCompl[2].trim();

  const partes = semCompl.split(",").map((p) => p.trim()).filter(Boolean);

  const ultima = partes[partes.length - 1] ?? "";
  const cidadeUf = ultima.match(/^(.*?)\s*-\s*([A-Za-z]{2})$/);
  if (cidadeUf && partes.length > 1) {
    e.cidade = cidadeUf[1].trim();
    e.uf = cidadeUf[2].toUpperCase();
    partes.pop();
  }

  if (partes.length >= 3) {
    e.rua = partes[0];
    e.numero = partes[1];
    e.bairro = partes.slice(2).join(", ");
  } else if (partes.length === 2) {
    e.rua = partes[0];
    /* "Rua X, 123" e "Rua X, Centro" tem a mesma forma — o que decide e o
       conteudo: so digitos (ou "s/n") e numero, o resto e bairro. */
    if (/^(\d+|s\/?n)$/i.test(partes[1])) e.numero = partes[1];
    else e.bairro = partes[1];
  } else if (partes.length === 1) {
    e.rua = partes[0];
  }

  return e;
}
