import axios from "axios";

// Validação matemática (sua implementação com pequenos ajustes)
function validarCNPJMatematico(cnpj: string): boolean {
  cnpj = cnpj.replace(/\D/g, "");

  if (cnpj.length !== 14 || /^(\d)\1{13}$/.test(cnpj)) {
    return false;
  }

  // Valida primeiro dígito
  let tamanho = cnpj.length - 2;
  let numeros = cnpj.substring(0, tamanho);
  const digitos = cnpj.substring(tamanho);
  let soma = 0;
  let pos = tamanho - 7;

  for (let i = tamanho; i >= 1; i--) {
    soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
    if (pos < 2) pos = 9;
  }

  let resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
  if (resultado !== parseInt(digitos.charAt(0))) {
    return false;
  }

  // Valida segundo dígito
  tamanho += 1;
  numeros = cnpj.substring(0, tamanho);
  soma = 0;
  pos = tamanho - 7;

  for (let i = tamanho; i >= 1; i--) {
    soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
    if (pos < 2) pos = 9;
  }

  resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
  if (resultado !== parseInt(digitos.charAt(1))) {
    return false;
  }

  return true;
}

// Função para consultar a API ReceitaWS
async function consultarCNPJReceitaWS(cnpj: string): Promise<boolean> {
  try {
    const cnpjLimpo = cnpj.replace(/\D/g, "");
    const response = await axios.get(
      `https://www.receitaws.com.br/v1/cnpj/${cnpjLimpo}`,
      {
        timeout: 5000, // timeout de 5 segundos
      }
    );
    console.log(response.data)
    return response.data.situacao === "ATIVA";
  } catch (error) {
    console.error("Erro na consulta externa:", error);
    return false;
  }
}

// Validador completo com fallback
export async function validarCNPJ(cnpj: string): Promise<boolean> {
  const validoMatematicamente = validarCNPJMatematico(cnpj);
  
  if (validoMatematicamente) {
    return true;
  }

  return await consultarCNPJReceitaWS(cnpj);
}

// Suas funções existentes (com pequena melhoria no gerador)
export function formatarCNPJ(cnpj: string): string {
  cnpj = cnpj.replace(/\D/g, "");
  return cnpj.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, "$1.$2.$3/$4-$5");
}

export function gerarCNPJ(): string {
  let cnpj = "";

  // Gera 8 dígitos aleatórios
  for (let i = 0; i < 8; i++) {
    cnpj += Math.floor(Math.random() * 10);
  }

  // Adiciona sequência padrão (0001 para matriz)
  cnpj += "0001";

  // Cálculo do primeiro dígito verificador
  let soma = 0;
  let peso = 5;

  for (let i = 0; i < 12; i++) {
    soma += parseInt(cnpj.charAt(i)) * peso;
    peso = peso === 2 ? 9 : peso - 1;
  }

  const digito1 = soma % 11 < 2 ? 0 : 11 - (soma % 11);
  cnpj += digito1;

  // Cálculo do segundo dígito verificador
  soma = 0;
  peso = 6;

  for (let i = 0; i < 13; i++) {
    soma += parseInt(cnpj.charAt(i)) * peso;
    peso = peso === 2 ? 9 : peso - 1;
  }

  const digito2 = soma % 11 < 2 ? 0 : 11 - (soma % 11);
  cnpj += digito2;

  return cnpj;
}
