<?php
/**
 * API de Aprovação Simplificada para Testes
 */

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

// Tratar OPTIONS (CORS preflight)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

// Ativar logs de erro para debug
ini_set('display_errors', 1);
ini_set('log_errors', 1);
error_reporting(E_ALL);

// Log de debug
error_log("=== DEBUG API GESTOR APROVACOES ===");
error_log("Método: " . $_SERVER['REQUEST_METHOD']);
error_log("Ação: " . ($_GET['acao'] ?? 'N/A'));

// Configuração básica de conexão
$host = 'localhost';
$dbname = 'pinheir3_controle_frotasV1.1';
$username = 'pinheir3_admin';
$password = '080880Gelboy';

// Função para conectar ao banco
function getConnection() {
    global $host, $dbname, $username, $password;
    
    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        error_log("✅ Conexão com banco estabelecida");
        return $pdo;
    } catch (Exception $e) {
        error_log("❌ Erro de conexão: " . $e->getMessage());
        return null;
    }
}

// Função para enviar resposta de sucesso
function sendSuccess($data, $message = 'Sucesso') {
    error_log("✅ Sucesso: " . $message);
    echo json_encode([
        'success' => true,
        'timestamp' => date('Y-m-d H:i:s'),
        'message' => $message,
        'data' => $data
    ]);
    exit;
}

// Função para enviar resposta de erro
function sendError($message, $code = 400) {
    error_log("❌ Erro $code: " . $message);
    http_response_code($code);
    echo json_encode([
        'success' => false,
        'timestamp' => date('Y-m-d H:i:s'),
        'message' => $message
    ]);
    exit;
}

// Função para enviar notificação push
function enviarNotificacaoPush($gestorId, $titulo, $mensagem, $tipo = 'geral', $dados = []) {
    try {
        $url = 'https://sistemas.pinheiroempresas.com.br/controlefrota/backend-php/api/gestao/enviar-notificacao-push.php';
        
        $postData = [
            'user_id' => $gestorId,
            'titulo' => $titulo,
            'mensagem' => $mensagem,
            'tipo' => $tipo,
            'dados' => $dados
        ];
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Bearer admin' // Token temporário para teste
        ]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        if ($httpCode === 200) {
            $responseData = json_decode($response, true);
            if (isset($responseData['success']) && $responseData['success']) {
                error_log("✅ Notificação push enviada para gestor $gestorId");
                return true;
            }
        }
        
        error_log("❌ Erro ao enviar notificação push: HTTP $httpCode, Response: $response");
        return false;
        
    } catch (Exception $e) {
        error_log("❌ Exceção ao enviar notificação push: " . $e->getMessage());
        return false;
    }
}

// Verificar ação
$acao = $_GET['acao'] ?? '';

try {
    // Conectar ao banco
    $pdo = getConnection();
    if (!$pdo) {
        sendError('Erro de conexão com banco de dados', 500);
    }

    if ($acao === 'aprovar') {
        // Verificar método HTTP
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            sendError('Método não permitido', 405);
        }

        // Obter dados da requisição
        $input = json_decode(file_get_contents('php://input'), true);
        error_log("📄 Dados recebidos: " . json_encode($input));
        
        if (!$input || !isset($input['solicitacao_id'])) {
            sendError('ID da solicitação obrigatório', 400);
        }

        $solicitacaoId = $input['solicitacao_id'];
        
        // 1. Verificar se é uma solicitação de viagem ou rota
        $stmt = $pdo->prepare("SELECT *, 'viagem' as tipo FROM solicitacoes_viagem WHERE id = ? AND status = 'pendente'");
        $stmt->execute([$solicitacaoId]);
        $solicitacao = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$solicitacao) {
            // Se não for viagem, verificar se é rota
            $stmt = $pdo->prepare("SELECT *, 'rota' as tipo FROM solicitacoes_rotas WHERE id = ? AND status = 'pendente'");
            $stmt->execute([$solicitacaoId]);
            $solicitacao = $stmt->fetch(PDO::FETCH_ASSOC);
        }
        
        if (!$solicitacao) {
            sendError('Solicitação não encontrada ou já processada', 404);
        }
        
        // 2. Atualizar status para aprovada (tabela correta baseada no tipo)
        if ($solicitacao['tipo'] === 'viagem') {
            $stmt = $pdo->prepare("UPDATE solicitacoes_viagem SET status = 'aprovada', observacoes = ? WHERE id = ?");
        } else {
            $stmt = $pdo->prepare("UPDATE solicitacoes_rotas SET status = 'aprovada', justificativa_gestor = ?, data_resposta = NOW() WHERE id = ?");
        }
        $result = $stmt->execute([$input['justificativa'] ?? '', $solicitacaoId]);
        
        if (!$result) {
            sendError('Erro ao atualizar solicitação', 500);
        }
        
        // 3. Enviar notificação push para o motorista
        $tecnicoId = $solicitacao['tipo'] === 'viagem' ? $solicitacao['tecnico_id'] : $solicitacao['motorista_id'];
        $mensagem = $solicitacao['tipo'] === 'viagem' ? 'Sua solicitação de viagem foi aprovada!' : 'Sua solicitação de rota foi aprovada!';
        $tipoNotificacao = $solicitacao['tipo'] === 'viagem' ? 'aprovacao_viagem' : 'aprovacao_rota';
        
        enviarNotificacaoPush(
            $tecnicoId,
            '✅ Solicitação Aprovada',
            $mensagem,
            $tipoNotificacao,
            ['solicitacao_id' => $solicitacaoId]
        );
        
        // 4. Resposta de sucesso
        sendSuccess([
            'solicitacao_id' => $solicitacaoId,
            'status' => 'aprovada',
            'mensagem' => 'Solicitação aprovada com sucesso'
        ]);

    } elseif ($acao === 'negar') {
        // Verificar método HTTP
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            sendError('Método não permitido', 405);
        }

        // Obter dados da requisição
        $input = json_decode(file_get_contents('php://input'), true);
        error_log("📄 Dados da negação: " . json_encode($input));
        
        if (!$input || !isset($input['solicitacao_id'])) {
            sendError('ID da solicitação obrigatório', 400);
        }

        if (!isset($input['justificativa']) || empty($input['justificativa'])) {
            sendError('Justificativa obrigatória para negar solicitação', 400);
        }

        $solicitacaoId = $input['solicitacao_id'];
        $justificativa = $input['justificativa'];
        
        error_log("🔍 Buscando solicitação ID: $solicitacaoId");
        
        // 1. Verificar se é uma solicitação de viagem ou rota
        $stmt = $pdo->prepare("SELECT *, 'viagem' as tipo FROM solicitacoes_viagem WHERE id = ? AND status = 'pendente'");
        $stmt->execute([$solicitacaoId]);
        $solicitacao = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$solicitacao) {
            // Se não for viagem, verificar se é rota
            $stmt = $pdo->prepare("SELECT *, 'rota' as tipo FROM solicitacoes_rotas WHERE id = ? AND status = 'pendente'");
            $stmt->execute([$solicitacaoId]);
            $solicitacao = $stmt->fetch(PDO::FETCH_ASSOC);
        }
        
        if (!$solicitacao) {
            sendError('Solicitação não encontrada ou já processada', 404);
        }
        
        error_log("✅ Solicitação encontrada, atualizando para negada");
        
        // 2. Atualizar status para negada (tabela correta baseada no tipo)
        if ($solicitacao['tipo'] === 'viagem') {
            $stmt = $pdo->prepare("UPDATE solicitacoes_viagem SET status = 'negada', observacoes = ? WHERE id = ?");
        } else {
            $stmt = $pdo->prepare("UPDATE solicitacoes_rotas SET status = 'negada', justificativa_gestor = ?, data_resposta = NOW() WHERE id = ?");
        }
        $result = $stmt->execute([$justificativa, $solicitacaoId]);
        
        if (!$result) {
            $error = $stmt->errorInfo();
            error_log("❌ Erro SQL: " . json_encode($error));
            sendError('Erro ao atualizar solicitação: ' . $error[2], 500);
        }
        
        // 3. Enviar notificação push para o motorista
        $tecnicoId = $solicitacao['tipo'] === 'viagem' ? $solicitacao['tecnico_id'] : $solicitacao['motorista_id'];
        $mensagem = $solicitacao['tipo'] === 'viagem' ? 'Sua solicitação de viagem foi negada: ' : 'Sua solicitação de rota foi negada: ';
        $tipoNotificacao = $solicitacao['tipo'] === 'viagem' ? 'negacao_viagem' : 'negacao_rota';
        
        enviarNotificacaoPush(
            $tecnicoId,
            '❌ Solicitação Negada',
            $mensagem . $justificativa,
            $tipoNotificacao,
            ['solicitacao_id' => $solicitacaoId, 'justificativa' => $justificativa]
        );
        
        error_log("✅ Solicitação negada com sucesso");
        
        // 4. Resposta de sucesso
        sendSuccess([
            'solicitacao_id' => $solicitacaoId,
            'status' => 'negada',
            'mensagem' => 'Solicitação negada com sucesso'
        ]);

    } else {
        sendError('Ação não reconhecida. Use: aprovar ou negar', 400);
    }

} catch (Exception $e) {
    error_log("💥 Exceção: " . $e->getMessage());
    error_log("💥 Stack trace: " . $e->getTraceAsString());
    sendError('Erro interno: ' . $e->getMessage(), 500);
}
?> 
