const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');

(async () => {
  try {
    // Carrega configurações do .env
    const envPath = path.join(__dirname, 'projeto', '.env');
    const envContent = fs.readFileSync(envPath, 'utf-8');
    
    const env = {};
    envContent.split('\n').forEach(line => {
      if (line && !line.startsWith('#') && line.includes('=')) {
        const [key, ...valueParts] = line.split('=');
        env[key.trim()] = valueParts.join('=').trim();
      }
    });

    // Credenciais do Bling
    const blingEmail = 'mplaces@atacadaodrogacenter.com.br';
    const blingPassword = 'Atacadao@123';
    
    const clientId = env.BLING_CLIENT_ID;
    const clientSecret = env.BLING_CLIENT_SECRET;
    const redirectUri = env.BLING_REDIRECT_URI;
    const authUrl = env.BLING_AUTH_URL;
    const tokenUrl = env.BLING_TOKEN_URL;
    const apiBase = env.BLING_API_BASE;

    console.log('🚀 Iniciando automação completa do OAuth2 Bling\n');

    // Construir URL de autorização
    const state = Math.random().toString(36).substring(7);
    const authorizationUrl = `${authUrl}?response_type=code&client_id=${clientId}&redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`;

    console.log('🌐 Abrindo navegador...');
    const browser = await chromium.launch({
      headless: false, // Visível para debug
    });

    const page = await browser.newPage({
      viewport: { width: 1280, height: 800 },
    });

    console.log('📍 Navegando para página de autorização...');
    await page.goto(authorizationUrl, { waitUntil: 'networkidle' });

    // Aguarda a página carregar
    await page.waitForLoadState('networkidle');

    console.log('🔍 Aguardando página estabilizar...');
    await page.waitForTimeout(3000);

    // Verifica se precisa fazer login checando URL
    const currentUrl = page.url();
    const needsLogin = currentUrl.includes('login.php') || currentUrl.includes('OAuth2/views');

    if (needsLogin) {
      console.log('🔐 Fazendo login automaticamente...');
      
      // Aguarda campos de login aparecerem
      await page.waitForSelector('input[type="text"], input[type="email"], input[name*="usuario"], input[name*="email"]', { timeout: 10000 });
      
      // Preenche email/usuário
      const emailField = page.locator('input[type="text"], input[type="email"], input[name*="usuario"], input[name*="email"]').first();
      await emailField.fill(blingEmail);
      await page.waitForTimeout(500);
      console.log('  ✓ Email preenchido');

      // Preenche senha
      const passwordField = page.locator('input[type="password"]').first();
      await passwordField.fill(blingPassword);
      await page.waitForTimeout(500);
      console.log('  ✓ Senha preenchida');

      // Clica no botão de login
      const loginButton = page.locator('button[type="submit"], input[type="submit"], button:has-text("Entrar"), button:has-text("Login"), input[value*="Entrar"]').first();
      await loginButton.click();
      console.log('  ✓ Botão de login clicado');

      // Aguarda navegação após login
      await page.waitForLoadState('networkidle', { timeout: 30000 });
      await page.waitForTimeout(2000);
      console.log('  ✓ Login realizado');
    } else {
      console.log('✓ Já está autenticado');
    }

    console.log('⏳ Aguardando página de autorização...');
    await page.waitForTimeout(2000);

    // Procura e clica no botão de autorizar
    const authorizeButton = await page.locator('button:has-text("Autorizar"), button:has-text("Permitir"), button:has-text("Aceitar"), input[value*="Autorizar"]').first();
    
    if (await authorizeButton.isVisible().catch(() => false)) {
      console.log('✅ Botão de autorização encontrado, clicando...');
      await authorizeButton.click();
    } else {
      console.log('⚠️  Botão de autorização não encontrado, aguardando redirecionamento...');
    }

    // Aguarda o redirecionamento para capturar o code
    console.log('⏳ Aguardando redirecionamento com CODE...');
    
    let codeCapturado = null;
    let tentativas = 0;
    const maxTentativas = 60; // 30 segundos

    while (!codeCapturado && tentativas < maxTentativas) {
      tentativas++;
      const currentUrl = page.url();
      
      if (currentUrl.includes('localhost:8000/bling/callback') && currentUrl.includes('code=')) {
        const urlObj = new URL(currentUrl);
        codeCapturado = urlObj.searchParams.get('code');
        const stateReceived = urlObj.searchParams.get('state');
        
        console.log('\n✅ CODE CAPTURADO COM SUCESSO!');
        console.log('📍 URL completa:', currentUrl);
        console.log('🔐 Authorization Code:', codeCapturado);
        console.log('🔑 State:', stateReceived);
        break;
      }
      
      await page.waitForTimeout(500);
    }

    await browser.close();

    if (!codeCapturado) {
      console.log('\n❌ Erro: Não foi possível capturar o code');
      console.log('URL final:', page.url());
      process.exit(1);
    }

    // PASSO 2: Trocar CODE por ACCESS_TOKEN imediatamente
    console.log('\n🔄 Trocando CODE por tokens de acesso...');

    const basicAuth = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');

    const tokenResponse = await fetch(tokenUrl, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': '1.0',
        'Authorization': `Basic ${basicAuth}`,
      },
      body: new URLSearchParams({
        grant_type: 'authorization_code',
        code: codeCapturado,
      }).toString(),
    });

    const tokenData = await tokenResponse.json();

    if (!tokenResponse.ok) {
      console.log('❌ Erro ao obter tokens:');
      console.log(JSON.stringify(tokenData, null, 2));
      process.exit(1);
    }

    console.log('\n✅ TOKENS OBTIDOS COM SUCESSO!\n');
    console.log('🔑 Access Token:', tokenData.access_token.substring(0, 50) + '...');
    console.log('🔄 Refresh Token:', tokenData.refresh_token.substring(0, 50) + '...');
    console.log('⏱️  Expira em:', tokenData.expires_in, 'segundos (' + (tokenData.expires_in / 3600) + ' horas)');
    console.log('🏷️  Token Type:', tokenData.token_type);
    console.log('📋 Scope:', tokenData.scope || 'N/A');

    // Salva tokens em arquivo JSON
    const tokenFile = path.join(__dirname, 'bling_auto_token.json');
    const tokenPayload = {
      access_token: tokenData.access_token,
      refresh_token: tokenData.refresh_token,
      expires_in: tokenData.expires_in,
      token_type: tokenData.token_type,
      scope: tokenData.scope || '',
      expires_at: new Date(Date.now() + tokenData.expires_in * 1000).toISOString(),
      created_at: new Date().toISOString(),
    };

    fs.writeFileSync(tokenFile, JSON.stringify(tokenPayload, null, 2));
    console.log('\n💾 Tokens salvos em:', tokenFile);

    // PASSO 3: Testar API
    console.log('\n📝 Testando API de produtos...');
    
    const apiResponse = await fetch(`${apiBase}/produtos/?limite=5&pagina=1`, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${tokenData.access_token}`,
        'Accept': 'application/json',
      },
    });

    const apiData = await apiResponse.json();

    if (apiResponse.ok) {
      console.log('✅ API funciona perfeitamente!\n');
      console.log('Primeiros produtos:');
      console.log(JSON.stringify(apiData, null, 2).substring(0, 500) + '...');
    } else {
      console.log('⚠️  Status da API:', apiResponse.status);
      console.log(JSON.stringify(apiData, null, 2));
    }

    console.log('\n🎉 AUTOMAÇÃO COMPLETA CONCLUÍDA COM SUCESSO!');
    console.log('\n📋 Próximos passos:');
    console.log('  php bling_auto.php test       # Testa conexão');
    console.log('  php bling_auto.php produtos   # Lista produtos');
    console.log('  php bling_auto.php pedidos    # Lista pedidos');
    console.log('\n🔄 O sistema renovará tokens automaticamente quando expirarem!');

  } catch (error) {
    console.error('\n❌ Erro:', error.message);
    console.error(error.stack);
    process.exit(1);
  }
})();
