<?php
require_once '../config/bootstrap.php';

// Configurações do Firebase V1
$service_account_file = __DIR__ . '/../config/firebase-service-account.json';
$project_id = 'controlefrota-d0989';

// Função para obter token de acesso
function getAccessToken($service_account_file) {
    $service_account = json_decode(file_get_contents($service_account_file), true);
    
    $header = [
        'alg' => 'RS256',
        'typ' => 'JWT'
    ];
    
    $payload = [
        'iss' => $service_account['client_email'],
        'scope' => 'https://www.googleapis.com/auth/firebase.messaging',
        'aud' => 'https://oauth2.googleapis.com/token',
        'exp' => time() + 3600,
        'iat' => time()
    ];
    
    $header_encoded = base64url_encode(json_encode($header));
    $payload_encoded = base64url_encode(json_encode($payload));
    
    $signature = '';
    openssl_sign($header_encoded . '.' . $payload_encoded, $signature, $service_account['private_key'], 'SHA256');
    $signature_encoded = base64url_encode($signature);
    
    $jwt = $header_encoded . '.' . $payload_encoded . '.' . $signature_encoded;
    
    // Trocar JWT por access token
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://oauth2.googleapis.com/token');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
        'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
        'assertion' => $jwt
    ]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/x-www-form-urlencoded'
    ]);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    $token_data = json_decode($response, true);
    return $token_data['access_token'] ?? null;
}

function base64url_encode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

// Função para enviar notificação push via API V1
function enviarNotificacaoPushV1($token, $titulo, $mensagem, $dados = []) {
    global $project_id;
    
    $access_token = getAccessToken(__DIR__ . '/../config/firebase-service-account.json');
    
    if (!$access_token) {
        return [
            "success" => false,
            "response" => "Erro ao obter access token",
            "http_code" => 0
        ];
    }
    
    $payload = [
        "message" => [
            "token" => $token,
            "notification" => [
                "title" => $titulo,
                "body" => $mensagem
            ],
            "data" => array_merge([
                "titulo" => $titulo,
                "mensagem" => $mensagem,
                "tipo" => "solicitacao_viagem",
                "timestamp" => time()
            ], $dados),
            "android" => [
                "priority" => "high",
                "notification" => [
                    "sound" => "default",
                    "default_sound" => true,
                    "default_vibrate_timings" => true,
                    "default_light_settings" => true
                ]
            ]
        ]
    ];
    
    $url = "https://fcm.googleapis.com/v1/projects/{$project_id}/messages:send";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer {$access_token}",
        "Content-Type: application/json"
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $response = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    return [
        "success" => $http_code == 200,
        "response" => $response,
        "http_code" => $http_code
    ];
}

// Função para buscar tokens FCM de gestores
function buscarTokensGestores() {
    global $pdo;
    
    $sql = "SELECT DISTINCT fcm_token, user_id, user_type 
            FROM fcm_tokens 
            WHERE user_type = 'gestor' 
            AND fcm_token IS NOT NULL 
            AND fcm_token != ''";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// Função para buscar tokens FCM de motoristas
function buscarTokensMotoristas() {
    global $pdo;
    
    $sql = "SELECT DISTINCT fcm_token, user_id, user_type 
            FROM fcm_tokens 
            WHERE user_type = 'motorista' 
            AND fcm_token IS NOT NULL 
            AND fcm_token != ''";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// Função para criar notificação no banco
function criarNotificacao($userId, $userType, $titulo, $mensagem, $tipo = "geral", $dados = []) {
    global $pdo;
    
    $sql = "INSERT INTO notificacoes (user_id, user_type, titulo, mensagem, tipo, dados, data_envio, lida) 
            VALUES (?, ?, ?, ?, ?, ?, NOW(), 0)";
    
    $stmt = $pdo->prepare($sql);
    $dadosJson = json_encode($dados);
    
    return $stmt->execute([$userId, $userType, $titulo, $mensagem, $tipo, $dadosJson]);
}

// Função para criar solicitação de teste
function criarSolicitacaoTeste() {
    global $pdo;
    
    $sql = "INSERT INTO solicitacoes_viagem 
            (tecnico_id, veiculo_id, cliente, motivo, km_inicial, latitude_inicial, longitude_inicial, 
             endereco_inicial, gestor_id, observacoes, prioridade, status, data_solicitacao) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())";
    
    $stmt = $pdo->prepare($sql);
    
    return $stmt->execute([
        "1", // tecnico_id
        "1", // veiculo_id  
        "Empresa Teste Ltda", // cliente
        "Teste de notificação push V1", // motivo
        "100", // km_inicial
        "-10.9091", // latitude_inicial
        "-37.0677", // longitude_inicial
        "Aracaju, SE", // endereco_inicial
        "2", // gestor_id
        "Solicitação criada para testar notificações push V1", // observacoes
        "normal", // prioridade
        "pendente" // status
    ]);
}

// Função principal de teste
function testarNotificacoesPushV1() {
    echo "🚀 TESTE DE NOTIFICAÇÕES PUSH V1\n";
    echo "==================================\n\n";
    
    // 1. Verificar arquivo de credenciais
    echo "1. 🔑 Verificando credenciais Firebase...\n";
    $service_account_file = __DIR__ . '/../config/firebase-service-account.json';
    
    if (!file_exists($service_account_file)) {
        echo "   ❌ Arquivo de credenciais não encontrado!\n";
        echo "   Caminho: $service_account_file\n\n";
        return;
    }
    
    echo "   ✅ Arquivo de credenciais encontrado\n\n";
    
    // 2. Verificar tokens disponíveis
    echo "2. 📱 Verificando tokens FCM...\n";
    $tokensGestores = buscarTokensGestores();
    $tokensMotoristas = buscarTokensMotoristas();
    
    echo "   Gestores com token: " . count($tokensGestores) . "\n";
    echo "   Motoristas com token: " . count($tokensMotoristas) . "\n\n";
    
    if (empty($tokensGestores) && empty($tokensMotoristas)) {
        echo "❌ Nenhum token FCM encontrado!\n";
        echo "   Para testar, primeiro registre um dispositivo no app.\n\n";
        return;
    }
    
    // 3. Criar solicitação de teste
    echo "3. 📝 Criando solicitação de teste...\n";
    $solicitacaoId = null;
    
    try {
        criarSolicitacaoTeste();
        $solicitacaoId = $pdo->lastInsertId();
        echo "   ✅ Solicitação criada com ID: $solicitacaoId\n\n";
    } catch (Exception $e) {
        echo "   ❌ Erro ao criar solicitação: " . $e->getMessage() . "\n\n";
        return;
    }
    
    // 4. Enviar notificação para gestores
    echo "4. 🔔 Enviando notificação para gestores...\n";
    $gestoresNotificados = 0;
    
    foreach ($tokensGestores as $token) {
        $titulo = "🚗 Nova Solicitação de Viagem";
        $mensagem = "Empresa Teste Ltda solicitou uma viagem para 'Teste de notificação push V1'";
        
        $dados = [
            "solicitacao_id" => $solicitacaoId,
            "gestor_id" => $token['user_id'],
            "cliente" => "Empresa Teste Ltda",
            "motivo" => "Teste de notificação push V1"
        ];
        
        $resultado = enviarNotificacaoPushV1($token['fcm_token'], $titulo, $mensagem, $dados);
        
        if ($resultado['success']) {
            echo "   ✅ Enviada para gestor {$token['user_id']}\n";
            criarNotificacao($token['user_id'], 'gestor', $titulo, $mensagem, 'solicitacao_viagem', $dados);
            $gestoresNotificados++;
        } else {
            echo "   ❌ Falha para gestor {$token['user_id']}: {$resultado['response']}\n";
        }
    }
    
    echo "   📊 Total de gestores notificados: $gestoresNotificados\n\n";
    
    // 5. Resumo final
    echo "5. 📊 RESUMO FINAL\n";
    echo "   =================\n";
    echo "   📝 Solicitação criada: ID $solicitacaoId\n";
    echo "   🔔 Gestores notificados: $gestoresNotificados\n";
    echo "   📱 Total de tokens: " . (count($tokensGestores) + count($tokensMotoristas)) . "\n";
    echo "   ✅ Teste concluído!\n\n";
    
    echo "💡 DICAS:\n";
    echo "   - Verifique se o app está instalado no dispositivo\n";
    echo "   - Confirme se as notificações estão habilitadas no Android\n";
    echo "   - Teste com o app fechado para verificar push real\n";
    echo "   - Verifique os logs do app para debug\n\n";
}

// Executar teste se chamado diretamente
if (basename(__FILE__) == basename($_SERVER['SCRIPT_NAME'])) {
    testarNotificacoesPushV1();
}
?> 
