const axios = require('axios');

// Configurações
const BASE_URL = 'https://bff-dev.saveinmed.com.br/api/v1';
const EMAIL = 'andre.fr93@gmail.com';
const SENHA = 'j875bth9';

let accessToken = '';
let userId = '';

async function login() {
  console.log('🔐 Fazendo login...');
  
  try {
    const response = await axios.post(`${BASE_URL}/auth/login`, {
      identificador: EMAIL,
      senha: SENHA
    });
    
    accessToken = response.data.access_token;
    console.log('✅ Login realizado com sucesso');
    console.log('Token:', accessToken.substring(0, 20) + '...');
    
    return true;
  } catch (error) {
    console.error('❌ Erro no login:', error.response?.data || error.message);
    return false;
  }
}

async function getUserData() {
  console.log('👤 Buscando dados do usuário...');
  
  try {
    const response = await axios.get(`${BASE_URL}/auth/me`, {
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'accept': 'application/json'
      }
    });
    
    userId = response.data.id || response.data._id || response.data.userId;
    console.log('✅ Dados do usuário obtidos');
    console.log('User ID:', userId);
    console.log('Dados:', JSON.stringify(response.data, null, 2));
    
    return response.data;
  } catch (error) {
    console.error('❌ Erro ao buscar dados do usuário:', error.response?.data || error.message);
    return null;
  }
}

async function criarEndereco() {
  console.log('📍 Criando endereço...');
  
  const enderecoData = {
    titulo: "Endereço Principal Teste",
    cep: "15990200",
    logradouro: "Rua São Lourenço",
    numero: "123",
    complemento: "casa",
    cidade: "Matão",
    estado: "SP",
    pais: "Brasil",
    bairro: "Centro"
  };
  
  try {
    const response = await axios.post(`${BASE_URL}/enderecos`, enderecoData, {
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json',
        'accept': 'application/json'
      }
    });
    
    const enderecoId = response.data.id || response.data._id;
    console.log('✅ Endereço criado com ID:', enderecoId);
    console.log('Resposta:', JSON.stringify(response.data, null, 2));
    
    return enderecoId;
  } catch (error) {
    console.error('❌ Erro ao criar endereço:', error.response?.data || error.message);
    console.error('Status:', error.response?.status);
    console.error('Headers:', error.response?.headers);
    return null;
  }
}

async function criarEmpresa(enderecoId) {
  console.log('🏢 Criando empresa...');
  
  // Vamos testar com um payload mais simples primeiro
  const empresaData = {
    cnpj: "15961591595252",
    "razao-social": "TESTE LTDA",
    "nome-fantasia": "TESTE",
    "data-abertura": "2000-02-20",
    situacao: "Ativa",
    "natureza-juridica": "TESTE sda",
    porte: "MEI",
    "capital-social": 50000,
    telefone: "15654894156",
    email: "andre.fr93@gmail.com",
    "atividade-principal-codigo": "1510",
    "atividade-principal-desc": "TESTE TESTE",
    enderecos: enderecoId ? [enderecoId] : []
  };
  
  console.log('Payload empresa:', JSON.stringify(empresaData, null, 2));
  
  try {
    const response = await axios.post(`${BASE_URL}/empresas`, empresaData, {
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json',
        'accept': 'application/json'
      }
    });
    
    const empresaId = response.data.id || response.data._id;
    console.log('✅ Empresa criada com ID:', empresaId);
    console.log('Resposta:', JSON.stringify(response.data, null, 2));
    
    return empresaId;
  } catch (error) {
    console.error('❌ Erro ao criar empresa:');
    console.error('Status:', error.response?.status);
    console.error('Data:', error.response?.data);
    
    // Vamos tentar sem alguns campos para identificar o problema
    console.log('\n🔄 Tentando com payload simplificado...');
    
    const empresaSimples = {
      cnpj: "15961591595252",
      "razao-social": "TESTE LTDA",
      "nome-fantasia": "TESTE",
      "data-abertura": "2000-02-20",
      situacao: "Ativa",
      "natureza-juridica": "TESTE sda",
      porte: "MEI",
      "capital-social": 50000,
      telefone: "15654894156",
      email: "andre.fr93@gmail.com",
      "atividade-principal-codigo": "1510",
      "atividade-principal-desc": "TESTE TESTE"
      // Removendo enderecos para testar
    };
    
    try {
      const response2 = await axios.post(`${BASE_URL}/empresas`, empresaSimples, {
        headers: {
          'Authorization': `Bearer ${accessToken}`,
          'Content-Type': 'application/json',
          'accept': 'application/json'
        }
      });
      
      const empresaId = response2.data.id || response2.data._id;
      console.log('✅ Empresa criada com payload simplificado - ID:', empresaId);
      return empresaId;
      
    } catch (error2) {
      console.error('❌ Erro mesmo com payload simplificado:', error2.response?.data);
      return null;
    }
  }
}

async function atualizarUsuario(enderecoId, empresaId) {
  console.log('👤 Atualizando usuário...');
  
  if (!userId) {
    console.error('❌ ID do usuário não encontrado');
    return false;
  }
  
  // Primeiro buscar dados atuais
  const userData = await getUserData();
  if (!userData) {
    return false;
  }
  
  // Gerenciar arrays de endereços e empresas - extrair apenas IDs
  const enderecosExistentes = userData.enderecos || [];
  const empresasExistentes = userData.empresasDados || [];

  // Extrair apenas os IDs dos endereços existentes
  const enderecosIds = enderecosExistentes.map((endereco) => {
    if (typeof endereco === 'string') {
      return endereco; // Já é um ID
    }
    return endereco.$id || endereco.id || endereco; // Extrair ID do objeto
  });

  // Extrair apenas os IDs das empresas existentes
  const empresasIds = empresasExistentes.map((empresa) => {
    if (typeof empresa === 'string') {
      return empresa; // Já é um ID
    }
    return empresa.$id || empresa.id || empresa; // Extrair ID do objeto
  });

  const usuarioData = {
    ...userData,
    nome: "NANDO",
    email: EMAIL,
    cpf: "12345678901", // CPF com exatamente 11 dígitos
    "nome-social": "NANDO TESTE", // Não pode ser vazio
    "registro-completo": true,
    enderecos: enderecoId ? [...enderecosIds, enderecoId] : enderecosIds,
    empresasDados: empresaId ? [...empresasIds, empresaId] : empresasIds
  };
  
  console.log('Payload usuário:', JSON.stringify(usuarioData, null, 2));
  
  try {
    const response = await axios.patch(`${BASE_URL}/usuarios/${userId}`, usuarioData, {
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json',
        'accept': 'application/json'
      }
    });
    
    console.log('✅ Usuário atualizado com sucesso');
    console.log('Resposta:', JSON.stringify(response.data, null, 2));
    
    return true;
  } catch (error) {
    console.error('❌ Erro ao atualizar usuário:');
    console.error('Status:', error.response?.status);
    console.error('Data:', error.response?.data);
    
    if (error.response?.data) {
      console.error('Detalhes do erro:', JSON.stringify(error.response.data, null, 2));
    }
    
    return false;
  }
}

async function testarFluxoCompleto() {
  console.log('🚀 Iniciando teste do fluxo completo...\n');
  
  // 1. Login
  const loginSuccess = await login();
  if (!loginSuccess) {
    console.log('❌ Falha no login, abortando teste');
    return;
  }
  
  console.log('\n');
  
  // 2. Buscar dados do usuário
  const userData = await getUserData();
  if (!userData) {
    console.log('❌ Falha ao buscar dados do usuário, abortando teste');
    return;
  }
  
  console.log('\n');
  
  // 3. Criar endereço
  const enderecoId = await criarEndereco();
  if (!enderecoId) {
    console.log('❌ Falha ao criar endereço, abortando teste');
    return;
  }
  
  console.log('\n');
  
  // 4. Criar empresa
  const empresaId = await criarEmpresa(enderecoId);
  if (!empresaId) {
    console.log('❌ Falha ao criar empresa, abortando teste');
    return;
  }
  
  console.log('\n');
  
  // 5. Atualizar usuário
  const updateSuccess = await atualizarUsuario(enderecoId, empresaId);
  if (!updateSuccess) {
    console.log('❌ Falha ao atualizar usuário');
    return;
  }
  
  console.log('\n🎉 Teste completo realizado com sucesso!');
  console.log(`✅ Endereço ID: ${enderecoId}`);
  console.log(`✅ Empresa ID: ${empresaId}`);
  console.log(`✅ Usuário atualizado`);
}

// Executar teste
testarFluxoCompleto().catch(console.error);