<?php
// ajax/get_olts_proximas.php - Busca OLTs próximas diretamente do banco
require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/../auth.php';
requireLogin();

header('Content-Type: application/json');

$cliente_lat = floatval($_GET['lat'] ?? 0);
$cliente_lng = floatval($_GET['lng'] ?? 0);
$limite = intval($_GET['limite'] ?? 10);

if (!$cliente_lat || !$cliente_lng) {
    echo json_encode(['error' => 'Coordenadas inválidas']);
    exit;
}

// Buscar OLTs do banco de dados
$stmt = pdo()->query("SELECT id, nome, latitude, longitude, endereco_cidade, modelo FROM olts WHERE ativo = 1 AND latitude IS NOT NULL AND longitude IS NOT NULL");
$olts = $stmt->fetchAll(PDO::FETCH_ASSOC);

// Calcular distância em linha reta para cada OLT
foreach ($olts as &$olt) {
    $olt['distancia_linha_reta'] = haversineDistance($cliente_lat, $cliente_lng, floatval($olt['latitude']), floatval($olt['longitude']));
}

// Ordenar por distância
usort($olts, function($a, $b) {
    return $a['distancia_linha_reta'] <=> $b['distancia_linha_reta'];
});

// Pegar apenas as mais próximas
$olts = array_slice($olts, 0, $limite);

// Para cada OLT, calcular rota real via OSRM
foreach ($olts as &$olt) {
    $rota = calcularRotaOSRM($cliente_lat, $cliente_lng, floatval($olt['latitude']), floatval($olt['longitude']));
    if ($rota) {
        $olt['distancia_real'] = $rota['distancia_km'];
        $olt['duracao_real'] = $rota['duracao_min'];
        $olt['geometria'] = $rota['geometria'];
    } else {
        $olt['distancia_real'] = $olt['distancia_linha_reta'];
        $olt['duracao_real'] = $olt['distancia_linha_reta'] * 2; // Estimativa
        $olt['geometria'] = null;
    }
}

echo json_encode(['success' => true, 'olts' => $olts]);

function haversineDistance($lat1, $lng1, $lat2, $lng2) {
    $earthRadius = 6371;
    $dLat = deg2rad($lat2 - $lat1);
    $dLng = deg2rad($lng2 - $lng1);
    $a = sin($dLat/2) * sin($dLat/2) +
         cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
         sin($dLng/2) * sin($dLng/2);
    $c = 2 * atan2(sqrt($a), sqrt(1-$a));
    return $earthRadius * $c;
}

function calcularRotaOSRM($origem_lat, $origem_lng, $destino_lat, $destino_lng) {
    $cacheKey = 'rota_' . md5("{$origem_lat},{$origem_lng}-{$destino_lat},{$destino_lng}");
    
    // Verificar cache
    $cacheFile = __DIR__ . '/../cache/' . $cacheKey . '.json';
    if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < 2592000) { // 30 dias
        return json_decode(file_get_contents($cacheFile), true);
    }
    
    $url = "http://router.project-osrm.org/route/v1/driving/{$origem_lng},{$origem_lat};{$destino_lng},{$destino_lat}?overview=full&geometries=geojson";
    
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_USERAGENT => 'MKTTelecom/2.7'
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpCode === 200 && $response) {
        $data = json_decode($response, true);
        if (!empty($data['routes'][0])) {
            $route = $data['routes'][0];
            $result = [
                'distancia_km' => round($route['distance'] / 1000, 2),
                'duracao_min' => round($route['duration'] / 60, 1),
                'geometria' => $route['geometry']['coordinates']
            ];
            
            // Salvar cache
            if (!is_dir(__DIR__ . '/../cache')) {
                mkdir(__DIR__ . '/../cache', 0755, true);
            }
            file_put_contents($cacheFile, json_encode($result));
            
            return $result;
        }
    }
    return null;
}
