export type CepLookupResult = {
  street: string;
  neighborhood: string;
  city: string;
  state: string;
  complement: string;
  zipCode: string;
};

function digitsOnly(value: string) {
  return value.replace(/\D/g, '');
}

export function formatCep(value: string) {
  const digits = digitsOnly(value).slice(0, 8);
  if (digits.length <= 5) {
    return digits;
  }
  return `${digits.slice(0, 5)}-${digits.slice(5)}`;
}

export async function lookupCep(value: string): Promise<CepLookupResult> {
  const cep = digitsOnly(value);
  if (cep.length !== 8) {
    throw new Error('Digite um CEP valido com 8 numeros.');
  }

  const response = await fetch(`https://viacep.com.br/ws/${cep}/json/`);
  const payload = (await response.json().catch(() => null)) as
    | {
        erro?: boolean;
        logradouro?: string;
        bairro?: string;
        localidade?: string;
        uf?: string;
        complemento?: string;
        cep?: string;
      }
    | null;

  if (!response.ok || !payload || payload.erro) {
    throw new Error('CEP nao encontrado.');
  }

  return {
    street: payload.logradouro?.trim() ?? '',
    neighborhood: payload.bairro?.trim() ?? '',
    city: payload.localidade?.trim() ?? '',
    state: payload.uf?.trim() ?? '',
    complement: payload.complemento?.trim() ?? '',
    zipCode: formatCep(payload.cep?.trim() ?? cep),
  };
}
