<?php
/**
 * 📍 API de Rastreamento GPS - Versão 2.0 Melhorada
 * Recebe dados de localização do app Android
 */

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

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

require_once 'conexao.php';

// Função de log melhorada
function logGPS($mensagem, $level = 'INFO') {
    $data = date('Y-m-d H:i:s');
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $log = "[$data] [$level] [IP:$ip] $mensagem\n";
    
    file_put_contents('logs/rastreamento-gps.log', $log, FILE_APPEND | LOCK_EX);
    
    // Log crítico também no error_log do servidor
    if ($level === 'ERROR') {
        error_log("GPS API ERROR: $mensagem");
    }
}

// Criar diretório de logs se não existir
if (!is_dir('logs')) {
    mkdir('logs', 0755, true);
}

logGPS("🔄 Nova requisição recebida - Método: " . $_SERVER['REQUEST_METHOD']);

// Verificar método
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    logGPS("❌ Método inválido: " . $_SERVER['REQUEST_METHOD'], 'ERROR');
    http_response_code(405);
    echo json_encode(['erro' => 'Apenas método POST aceito']);
    exit;
}

// Pegar dados do POST
$json = file_get_contents('php://input');
$data = json_decode($json, true);

logGPS("📦 Dados recebidos: " . json_encode($data));

// Validações básicas
$camposObrigatorios = ['viagem_id', 'latitude', 'longitude'];
$camposFaltando = [];

foreach ($camposObrigatorios as $campo) {
    if (!isset($data[$campo]) || $data[$campo] === '' || $data[$campo] === null) {
        $camposFaltando[] = $campo;
    }
}

if (!empty($camposFaltando)) {
    logGPS("❌ Campos obrigatórios faltando: " . implode(', ', $camposFaltando), 'ERROR');
    http_response_code(400);
    echo json_encode([
        'erro' => 'Dados incompletos',
        'campos_faltando' => $camposFaltando
    ]);
    exit;
}

// Validar tipos de dados
if (!is_numeric($data['viagem_id']) || !is_numeric($data['latitude']) || !is_numeric($data['longitude'])) {
    logGPS("❌ Tipos de dados inválidos", 'ERROR');
    http_response_code(400);
    echo json_encode(['erro' => 'Tipos de dados inválidos (devem ser numéricos)']);
    exit;
}

// Validar coordenadas GPS válidas
$lat = floatval($data['latitude']);
$lng = floatval($data['longitude']);

if ($lat < -90 || $lat > 90 || $lng < -180 || $lng > 180) {
    logGPS("❌ Coordenadas GPS inválidas: lat=$lat, lng=$lng", 'ERROR');
    http_response_code(400);
    echo json_encode(['erro' => 'Coordenadas GPS inválidas']);
    exit;
}

// Evitar coordenadas 0,0 (erro comum)
if ($lat == 0 && $lng == 0) {
    logGPS("❌ Coordenadas 0,0 rejeitadas (erro de GPS)", 'WARN');
    http_response_code(400);
    echo json_encode(['erro' => 'Coordenadas 0,0 inválidas']);
    exit;
}

try {
    logGPS("🔍 Verificando viagem ID: " . $data['viagem_id']);
    
    // Verificar se a viagem existe
    $sql = "SELECT id, tecnico_id, cliente FROM viagens WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$data['viagem_id']]);
    $viagem = $stmt->fetch();
    
    if (!$viagem) {
        logGPS("❌ Viagem não encontrada: " . $data['viagem_id'], 'ERROR');
        http_response_code(404);
        echo json_encode(['erro' => 'Viagem não encontrada']);
        exit;
    }
    
    logGPS("✅ Viagem encontrada: {$viagem['id']} - Cliente: {$viagem['cliente']}");
    
    // Preparar dados para inserção
    $dadosInsercao = [
        'viagem_id' => intval($data['viagem_id']),
        'latitude' => $lat,
        'longitude' => $lng,
        'velocidade' => isset($data['velocidade']) ? floatval($data['velocidade']) : 0,
        'precisao' => isset($data['precisao']) ? floatval($data['precisao']) : 0,
        'altitude' => isset($data['altitude']) ? floatval($data['altitude']) : 0,
        'battery_level' => isset($data['batteryLevel']) ? intval($data['batteryLevel']) : 100
    ];
    
    logGPS("💾 Inserindo ponto GPS: " . json_encode($dadosInsercao));
    
    // Inserir ponto na tabela principal
    $sql = "INSERT INTO rastreamento_tempo_real 
            (viagem_id, latitude, longitude, velocidade, precisao, altitude, battery_level, timestamp)
            VALUES 
            (?, ?, ?, ?, ?, ?, ?, NOW())";
            
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        $dadosInsercao['viagem_id'],
        $dadosInsercao['latitude'],
        $dadosInsercao['longitude'],
        $dadosInsercao['velocidade'],
        $dadosInsercao['precisao'],
        $dadosInsercao['altitude'],
        $dadosInsercao['battery_level']
    ]);
    
    $pontoId = $pdo->lastInsertId();
    logGPS("✅ Ponto GPS salvo com ID: $pontoId");
    
    // Tentar inserir também na tabela trajeto_pontos (se existir)
    try {
        $sql = "INSERT INTO trajeto_pontos 
                (viagem_id, latitude, longitude, timestamp_ponto, velocidade, precisao)
                VALUES 
                (?, ?, ?, NOW(), ?, ?)";
                
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            $dadosInsercao['viagem_id'],
            $dadosInsercao['latitude'],
            $dadosInsercao['longitude'],
            $dadosInsercao['velocidade'],
            $dadosInsercao['precisao']
        ]);
        
        logGPS("✅ Ponto também salvo em trajeto_pontos");
        
    } catch (Exception $e) {
        logGPS("⚠️ Erro ao salvar em trajeto_pontos (tabela pode não existir): " . $e->getMessage(), 'WARN');
    }
    
    // Atualizar status do técnico (se tabela existir)
    if ($viagem['tecnico_id']) {
        try {
            // Verificar se tabela status_tecnicos existe
            $stmt = $pdo->query("SHOW TABLES LIKE 'status_tecnicos'");
            if ($stmt->rowCount() > 0) {
                $sql = "INSERT INTO status_tecnicos 
                        (tecnico_id, ultima_latitude, ultima_longitude, ultimo_update, status)
                        VALUES 
                        (?, ?, ?, NOW(), 'online')
                        ON DUPLICATE KEY UPDATE
                        ultima_latitude = VALUES(ultima_latitude),
                        ultima_longitude = VALUES(ultima_longitude),
                        ultimo_update = NOW(),
                        status = 'online'";
                        
                $stmt = $pdo->prepare($sql);
                $stmt->execute([
                    $viagem['tecnico_id'],
                    $dadosInsercao['latitude'],
                    $dadosInsercao['longitude']
                ]);
                
                logGPS("✅ Status do técnico atualizado");
            }
        } catch (Exception $e) {
            logGPS("⚠️ Erro ao atualizar status do técnico: " . $e->getMessage(), 'WARN');
        }
    }
    
    // Contar total de pontos GPS para esta viagem
    $stmt = $pdo->prepare("SELECT COUNT(*) as total FROM rastreamento_tempo_real WHERE viagem_id = ?");
    $stmt->execute([$data['viagem_id']]);
    $totalPontos = $stmt->fetch()['total'];
    
    logGPS("📊 Total de pontos GPS para viagem {$data['viagem_id']}: $totalPontos");
    
    // Resposta de sucesso
    $resposta = [
        'sucesso' => true,
        'mensagem' => 'Localização salva com sucesso',
        'ponto_id' => $pontoId,
        'total_pontos' => $totalPontos,
        'viagem_id' => $data['viagem_id'],
        'coordenadas' => [
            'latitude' => $dadosInsercao['latitude'],
            'longitude' => $dadosInsercao['longitude']
        ]
    ];
    
    logGPS("🎉 SUCESSO: " . json_encode($resposta));
    
    echo json_encode($resposta);
    
} catch (Exception $e) {
    logGPS("💥 ERRO CRÍTICO: " . $e->getMessage(), 'ERROR');
    logGPS("Stack trace: " . $e->getTraceAsString(), 'ERROR');
    
    http_response_code(500);
    echo json_encode([
        'erro' => 'Erro interno do servidor',
        'mensagem' => 'Erro ao salvar localização',
        'detalhes' => $e->getMessage(),
        'codigo' => $e->getCode()
    ]);
}
?> 
