<?php
/**
 * Bling OAuth2 - Automação COMPLETA via cURL (sem navegador)
 * Funciona em Ubuntu Server
 * 
 * Fluxo:
 * 1. Faz login via POST no Bling
 * 2. Obtém cookies de sessão
 * 3. Autoriza o aplicativo
 * 4. Captura o authorization code
 * 5. Troca por access_token e refresh_token
 * 6. Salva tokens para uso futuro
 * 
 * Uso: php bling_oauth_curl.php
 */

// Configurações diretas do .env
$clientId = 'd3f1028fe1b8812e74c783e41bf334839233eabb';
$clientSecret = '8f82c37b4afbc3775d7cc55a2c91ef793d7f966523de2555ad3a22da28f0';
$redirectUri = 'http://localhost:8000/bling/callback';
$tokenUrl = 'https://bling.com.br/Api/v3/oauth/token';
$apiBase = 'https://api.bling.com.br/Api/v3';

// Credenciais de login
$email = 'mplaces@atacadaodrogacenter.com.br';
$senha = 'Atacadao@123';

$cookieFile = __DIR__ . '/bling_cookies.txt';
$tokenFile = __DIR__ . '/bling_auto_token.json';

echo "=== BLING OAuth2 - Automação via cURL ===\n\n";

// ==================== PASSO 1: Acessar URL OAuth (redireciona para login) ====================
echo "📋 PASSO 1: Acessando URL de autorização OAuth...\n";

$state = bin2hex(random_bytes(16));
$authUrl = "https://www.bling.com.br/Api/v3/oauth/authorize?response_type=code&client_id=$clientId&redirect_uri=" . urlencode($redirectUri) . "&state=$state";

echo "  URL OAuth: $authUrl\n";

// Acessa URL OAuth - será redirecionado para login
$ch = curl_init($authUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
]);

$loginHtml = curl_exec($ch);
$loginPageUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close($ch);

echo "  Redirecionado para: $loginPageUrl\n";

// ==================== PASSO 2: Analisar página de login ====================
echo "\n📋 PASSO 2: Analisando página de login...\n";

// Salva HTML para inspeção
file_put_contents(__DIR__ . '/bling_login_page.html', $loginHtml);
echo "  HTML salvo em: bling_login_page.html\n";

// Procura o form action
preg_match('/<form[^>]*action=["\']([^"\']+)["\'][^>]*>/i', $loginHtml, $formMatch);

$loginPostUrl = 'https://www.bling.com.br/login.ajax.php'; // Padrão conhecido

if (!empty($formMatch[1])) {
    $action = $formMatch[1];
    if (!preg_match('/^https?:\/\//', $action)) {
        $loginPostUrl = 'https://www.bling.com.br' . ltrim($action, '/');
    } else {
        $loginPostUrl = $action;
    }
}

echo "  Form action: $loginPostUrl\n";

// Procura campos de input
$hasUsuario = preg_match('/name=["\']usuario["\']/', $loginHtml);
$hasSenha = preg_match('/name=["\']senha["\']/', $loginHtml);

echo "  Campo 'usuario': " . ($hasUsuario ? 'encontrado' : 'não encontrado') . "\n";
echo "  Campo 'senha': " . ($hasSenha ? 'encontrado' : 'não encontrado') . "\n";

// Procura tokens CSRF
$csrfName = null;
$csrfValue = null;

if (preg_match('/name=["\']csrf_name["\'][^>]*value=["\']([^"\']+)["\']/', $loginHtml, $match)) {
    $csrfName = $match[1];
    echo "  csrf_name: $csrfName\n";
}

if (preg_match('/name=["\']csrf_value["\'][^>]*value=["\']([^"\']+)["\']/', $loginHtml, $match)) {
    $csrfValue = $match[1];
    echo "  csrf_value: " . substr($csrfValue, 0, 20) . "...\n";
}

// ==================== PASSO 3: Fazer login (POST) ====================
echo "\n📋 PASSO 3: Fazendo login...\n";

// Usa o form action encontrado na página (contém os parâmetros OAuth)
if (preg_match('/action=["\']([^"\']+)["\']/', $loginHtml, $formActionMatch)) {
    $loginPostUrl = html_entity_decode($formActionMatch[1]);
    if (!preg_match('/^https?:\/\//', $loginPostUrl)) {
        $loginPostUrl = 'https://www.bling.com.br' . ltrim($loginPostUrl, '/');
    }
}

echo "  POST para: $loginPostUrl\n";

$postData = [
    'login' => $email,  // Campo correto é 'login', não 'usuario'
    'password' => $senha,  // Campo correto é 'password', não 'senha'
];

// Adiciona CSRF tokens se encontrados
if ($csrfName) {
    $postData['csrf_name'] = $csrfName;
}
if ($csrfValue) {
    $postData['csrf_value'] = $csrfValue;
}

$ch = curl_init($loginPostUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query($postData),
    CURLOPT_FOLLOWLOCATION => false, // Capturar redirect manualmente
    CURLOPT_HEADER => true,
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Origin: https://www.bling.com.br',
        'Referer: ' . $loginPageUrl,
    ],
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
]);

$loginResponse = curl_exec($ch);
$loginHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "  HTTP Status: $loginHttpCode\n";

if ($loginHttpCode === 302 || $loginHttpCode === 301) {
    preg_match('/Location: (.+?)[\r\n]/i', $loginResponse, $loginRedirectMatch);
    if (!empty($loginRedirectMatch[1])) {
        echo "  Redirect após login: " . trim($loginRedirectMatch[1]) . "\n";
    }
    echo "  ✓ Login bem-sucedido (redirect)\n";
} else if ($loginHttpCode === 200) {
    echo "  ✓ Login processado\n";
} else {
    echo "  ⚠️  Status inesperado: $loginHttpCode\n";
}

// ==================== PASSO 4: Autorizar aplicativo ====================
echo "\n📋 PASSO 4: Autorizando aplicativo (com cookies)...\n";

// Acessa novamente a URL OAuth, agora autenticado
$ch = curl_init($authUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false, // Não seguir redirect para capturar code
    CURLOPT_HEADER => true,
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
]);

$authResponse = curl_exec($ch);
$authHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "  HTTP Status: $authHttpCode\n";

// ==================== PASSO 5: Capturar authorization code ====================
echo "\n📋 PASSO 5: Capturando authorization code...\n";

$code = null;

// Se retornou 302 (redirect), procura o Location header
if ($authHttpCode === 302 || $authHttpCode === 301) {
    preg_match('/Location: (.+?)[\r\n]/i', $authResponse, $locationMatch);
    if (!empty($locationMatch[1])) {
        $redirectUrl = trim($locationMatch[1]);
        echo "  Redirect para: $redirectUrl\n";
        
        // Extrai o code da URL
        if (preg_match('/code=([^&\s]+)/', $redirectUrl, $codeMatch)) {
            $code = $codeMatch[1];
        }
    }
}

// Se não achou, procura no HTML
if (!$code && preg_match('/code=([^&"\'\s]+)/', $authResponse, $codeMatch)) {
    $code = $codeMatch[1];
}

if (!$code) {
    echo "❌ Não foi possível capturar o authorization code\n";
    echo "Resposta (primeiros 1000 chars):\n";
    echo substr($authResponse, 0, 1000) . "\n";
    exit(1);
}

echo "  ✓ CODE capturado: $code\n\n";

// ==================== PASSO 6: Trocar code por tokens ====================
echo "📋 PASSO 6: Trocando CODE por access_token...\n";

$basicAuth = base64_encode("$clientId:$clientSecret");

$ch = curl_init($tokenUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'grant_type' => 'authorization_code',
        'code' => $code,
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Accept: 1.0',
        'Authorization: Basic ' . $basicAuth,
    ],
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "  HTTP Status: $httpCode\n";

$tokenData = json_decode($response, true);

if ($httpCode !== 200 || !isset($tokenData['access_token'])) {
    echo "❌ Erro ao obter tokens\n";
    echo json_encode($tokenData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
    exit(1);
}

echo "  ✓ Tokens obtidos com sucesso!\n\n";

// ==================== PASSO 7: Salvar tokens ====================
$tokenData['expires_at'] = date('Y-m-d H:i:s', time() + $tokenData['expires_in']);
$tokenData['created_at'] = date('Y-m-d H:i:s');

file_put_contents($tokenFile, json_encode($tokenData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

echo "✅ AUTOMAÇÃO CONCLUÍDA COM SUCESSO!\n\n";
echo "🔑 Access Token: " . substr($tokenData['access_token'], 0, 50) . "...\n";
echo "🔄 Refresh Token: " . substr($tokenData['refresh_token'], 0, 50) . "...\n";
echo "⏱️  Expira em: " . $tokenData['expires_in'] . " segundos (" . ($tokenData['expires_in'] / 3600) . " horas)\n";
echo "💾 Salvo em: $tokenFile\n\n";

// ==================== PASSO 8: Testar API ====================
echo "📋 PASSO 8: Testando API de produtos...\n";

$ch = curl_init($apiBase . '/produtos/?limite=3&pagina=1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $tokenData['access_token'],
    ],
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $products = json_decode($response, true);
    echo "✅ API funciona!\n";
    echo json_encode($products, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
} else {
    echo "⚠️  Status: $httpCode\n$response\n";
}

echo "\n🎉 Sistema pronto! Use:\n";
echo "  php bling_auto.php test\n";
echo "  php bling_auto.php produtos\n";
echo "  php bling_auto.php pedidos\n";

// Limpa arquivo de cookies
@unlink($cookieFile);
