<?php
/**
 * Bling API - Sistema Automatizado com Refresh Token
 * 
 * Este script NUNCA precisa de navegador após a configuração inicial
 * Usa refresh_token para renovar automaticamente
 * 
 * Configuração inicial (APENAS UMA VEZ):
 *   1. Copie o access_token e refresh_token do Postman
 *   2. Execute: php bling_auto.php setup ACCESS_TOKEN REFRESH_TOKEN
 * 
 * Uso depois de configurado:
 *   php bling_auto.php produtos    # Lista produtos (renova token se necessário)
 *   php bling_auto.php pedidos     # Lista pedidos
 *   php bling_auto.php test        # Testa conexão
 */

$command = $argv[1] ?? 'help';

// Carrega .env
$envFile = __DIR__ . '/projeto/.env';
$env = parse_ini_file($envFile);

$clientId = $env['BLING_CLIENT_ID'];
$clientSecret = $env['BLING_CLIENT_SECRET'];
$tokenUrl = $env['BLING_TOKEN_URL'];
$apiBase = $env['BLING_API_BASE'];

$tokenFile = __DIR__ . '/bling_auto_token.json';

// ==================== FUNÇÃO: Renovar Token ====================
function refreshAccessToken($refreshToken, $clientId, $clientSecret, $tokenUrl) {
    $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' => 'refresh_token',
            'refresh_token' => $refreshToken,
        ]),
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/x-www-form-urlencoded',
            'Accept: 1.0',
            'Authorization: Basic ' . $basicAuth,
        ],
        CURLOPT_TIMEOUT => 30,
        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) {
        return ['error' => "HTTP $httpCode", 'response' => $response];
    }
    
    return json_decode($response, true);
}

// ==================== FUNÇÃO: Obter Token Válido ====================
function getValidToken($tokenFile, $clientId, $clientSecret, $tokenUrl) {
    if (!file_exists($tokenFile)) {
        return ['error' => 'Token não configurado. Execute: php bling_auto.php setup ACCESS_TOKEN REFRESH_TOKEN'];
    }
    
    $tokenData = json_decode(file_get_contents($tokenFile), true);
    $expiresAt = strtotime($tokenData['expires_at']);
    
    // Se token ainda válido (com margem de 5 minutos)
    if ($expiresAt > (time() + 300)) {
        return $tokenData;
    }
    
    // Token expirado, renovar
    echo "⏳ Token expirado, renovando automaticamente...\n";
    $newToken = refreshAccessToken($tokenData['refresh_token'], $clientId, $clientSecret, $tokenUrl);
    
    if (isset($newToken['error'])) {
        return $newToken;
    }
    
    // Salva novo token
    $newToken['expires_at'] = date('Y-m-d H:i:s', time() + $newToken['expires_in']);
    $newToken['updated_at'] = date('Y-m-d H:i:s');
    file_put_contents($tokenFile, json_encode($newToken, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
    
    echo "✅ Token renovado com sucesso!\n\n";
    return $newToken;
}

// ==================== COMANDO: setup ====================
if ($command === 'setup') {
    if (!isset($argv[2]) || !isset($argv[3])) {
        echo "❌ Uso: php bling_auto.php setup ACCESS_TOKEN REFRESH_TOKEN\n";
        echo "\nCopie os tokens do Postman (aba Authorization)\n";
        exit(1);
    }
    
    $accessToken = $argv[2];
    $refreshToken = $argv[3];
    $expiresIn = $argv[4] ?? 21600; // Padrão: 6 horas
    
    $tokenData = [
        'access_token' => $accessToken,
        'refresh_token' => $refreshToken,
        'expires_in' => $expiresIn,
        'token_type' => 'Bearer',
        'expires_at' => date('Y-m-d H:i:s', time() + $expiresIn),
        'created_at' => date('Y-m-d H:i:s'),
    ];
    
    file_put_contents($tokenFile, json_encode($tokenData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
    
    echo "✅ Configuração salva com sucesso!\n";
    echo "📁 Arquivo: $tokenFile\n\n";
    echo "Agora você pode usar:\n";
    echo "  php bling_auto.php test\n";
    echo "  php bling_auto.php produtos\n";
    echo "  php bling_auto.php pedidos\n";
}

// ==================== COMANDO: test ====================
elseif ($command === 'test') {
    echo "=== Teste de Conexão Bling ===\n\n";
    
    $token = getValidToken($tokenFile, $clientId, $clientSecret, $tokenUrl);
    
    if (isset($token['error'])) {
        echo "❌ Erro: " . $token['error'] . "\n";
        exit(1);
    }
    
    echo "✅ Token válido até: " . $token['expires_at'] . "\n";
    echo "🔑 Access Token: " . substr($token['access_token'], 0, 40) . "...\n\n";
    
    // Testa chamada à API
    $ch = curl_init($apiBase . '/produtos/?limite=3&pagina=1');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . $token['access_token'],
        ],
        CURLOPT_TIMEOUT => 30,
        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";
    
    if ($httpCode === 200) {
        echo "✅ API funciona perfeitamente!\n";
        $data = json_decode($response, true);
        echo "\nPrimeiros produtos:\n";
        echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
    } else {
        echo "❌ Erro na API\n";
        echo $response . "\n";
    }
}

// ==================== COMANDO: produtos ====================
elseif ($command === 'produtos') {
    $token = getValidToken($tokenFile, $clientId, $clientSecret, $tokenUrl);
    
    if (isset($token['error'])) {
        echo "❌ " . $token['error'] . "\n";
        exit(1);
    }
    
    $limite = $argv[2] ?? 100;
    $pagina = $argv[3] ?? 1;
    
    echo "=== Listando Produtos (limite=$limite, pagina=$pagina) ===\n\n";
    
    $ch = curl_init($apiBase . "/produtos/?limite=$limite&pagina=$pagina");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . $token['access_token'],
        ],
        CURLOPT_TIMEOUT => 30,
        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) {
        $data = json_decode($response, true);
        echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
    } else {
        echo "❌ HTTP $httpCode\n$response\n";
    }
}

// ==================== COMANDO: pedidos ====================
elseif ($command === 'pedidos') {
    $token = getValidToken($tokenFile, $clientId, $clientSecret, $tokenUrl);
    
    if (isset($token['error'])) {
        echo "❌ " . $token['error'] . "\n";
        exit(1);
    }
    
    $limite = $argv[2] ?? 50;
    $pagina = $argv[3] ?? 1;
    
    echo "=== Listando Pedidos (limite=$limite, pagina=$pagina) ===\n\n";
    
    $ch = curl_init($apiBase . "/pedidos/vendas/?limite=$limite&pagina=$pagina");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . $token['access_token'],
        ],
        CURLOPT_TIMEOUT => 30,
        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) {
        $data = json_decode($response, true);
        echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
    } else {
        echo "❌ HTTP $httpCode\n$response\n";
    }
}

// ==================== COMANDO: help ====================
else {
    echo "=== Bling API - Sistema Automatizado ===\n\n";
    echo "Este sistema NUNCA precisa de navegador após configuração inicial\n\n";
    
    echo "📋 Configuração Inicial (APENAS UMA VEZ):\n\n";
    echo "1. Abra o Postman\n";
    echo "2. Vá na aba 'Authorization' da coleção Bling\n";
    echo "3. Copie o 'Access Token' e 'Refresh Token'\n";
    echo "4. Execute:\n";
    echo "   php bling_auto.php setup ACCESS_TOKEN REFRESH_TOKEN\n\n";
    
    echo "📋 Comandos Disponíveis:\n\n";
    echo "  php bling_auto.php test\n";
    echo "    Testa conexão e renova token se necessário\n\n";
    
    echo "  php bling_auto.php produtos [limite] [pagina]\n";
    echo "    Lista produtos (padrão: 100 por página)\n\n";
    
    echo "  php bling_auto.php pedidos [limite] [pagina]\n";
    echo "    Lista pedidos (padrão: 50 por página)\n\n";
    
    echo "🔄 Renovação Automática:\n";
    echo "  O sistema renova o token automaticamente quando expirar\n";
    echo "  Você NUNCA mais precisa usar navegador\n";
}
