<?php
/**
 * ajax/ctos.php
 * Retorna TODAS as marcações do arquivo projeto_rede.kml (sem filtro de nome).
 * Cache em assets/ctos.json.
 */
require_once __DIR__ . '/../auth.php';
require_once __DIR__ . '/../functions.php';
requireLogin();

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: public, max-age=3600');

$cacheFile = __DIR__ . '/../assets/ctos.json';
$kmlFile   = __DIR__ . '/../projeto_rede.kml';

// Se cache existe e KML não foi alterado, serve do cache
if (is_file($cacheFile) && is_file($kmlFile)) {
    $cacheTime = filemtime($cacheFile);
    $kmlTime   = filemtime($kmlFile);
    if ($cacheTime >= $kmlTime) {
        $json = file_get_contents($cacheFile);
        if ($json) {
            $ctos = json_decode($json, true);
            if (is_array($ctos) && !empty($ctos)) {
                echo json_encode(['ok' => true, 'ctos' => $ctos, 'total' => count($ctos), 'fonte' => 'cache_json']);
                exit;
            }
        }
    }
}

// KML não encontrado
if (!is_file($kmlFile)) {
    echo json_encode(['ok' => false, 'erro' => 'Arquivo KML não encontrado (projeto_rede.kml)', 'ctos' => []]);
    exit;
}

libxml_use_internal_errors(true);
$xml = simplexml_load_file($kmlFile);
if (!$xml) {
    echo json_encode(['ok' => false, 'erro' => 'Falha ao interpretar o KML', 'ctos' => []]);
    exit;
}

$xml->registerXPathNamespace('kml', 'http://www.opengis.net/kml/2.2');
$placemarks = $xml->xpath('//kml:Placemark');
if (empty($placemarks)) {
    $placemarks = $xml->xpath('//Placemark');
}

$ctos = [];
if (!empty($placemarks)) {
    foreach ($placemarks as $pm) {
        $name = trim((string)($pm->name ?? ''));
        // Nenhum filtro: aceita todos os Placemarks, mesmo sem nome
        // (se não tiver nome, usamos "Sem nome" para referência)
        if ($name === '') {
            $name = 'Sem nome';
        }

        // Extrai coordenadas (tenta várias abordagens)
        $coords = null;
        $points = $pm->xpath('.//kml:Point/kml:coordinates');
        if (!empty($points)) $coords = trim((string)$points[0]);
        if (!$coords) {
            $points = $pm->xpath('.//Point/coordinates');
            if (!empty($points)) $coords = trim((string)$points[0]);
        }
        if (!$coords) {
            $lines = $pm->xpath('.//kml:LineString/kml:coordinates');
            if (!empty($lines)) {
                $lineCoords = trim((string)$lines[0]);
                $parts = preg_split('/\s+/', $lineCoords);
                $coords = $parts[0] ?? null;
            }
        }
        if (!$coords) {
            $allCoords = $pm->xpath('.//coordinates');
            if (!empty($allCoords)) {
                $coords = trim((string)$allCoords[0]);
                $parts = preg_split('/\s+/', $coords);
                $coords = $parts[0] ?? $coords;
            }
        }
        // Se ainda não encontrou coordenadas, ignora este Placemark
        if (!$coords || empty(trim($coords))) continue;

        $xyz = explode(',', trim($coords));
        if (count($xyz) < 2) continue;

        $lng = (float)trim($xyz[0]);
        $lat = (float)trim($xyz[1]);
        if ($lat == 0 && $lng == 0) continue;
        if ($lat < -90 || $lat > 90 || $lng < -180 || $lng > 180) continue;

        $ctos[] = [
            'name' => $name,
            'lat'  => round($lat, 7),
            'lng'  => round($lng, 7),
        ];
    }
}

// Salva cache e retorna
if (!empty($ctos)) {
    $dir = dirname($cacheFile);
    if (!is_dir($dir)) mkdir($dir, 0755, true);
    file_put_contents($cacheFile, json_encode($ctos, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));

    echo json_encode([
        'ok'    => true,
        'ctos'  => $ctos,
        'total' => count($ctos),
        'fonte' => 'kml'
    ]);
} else {
    echo json_encode(['ok' => false, 'erro' => 'Nenhuma marcação encontrada no KML', 'ctos' => []]);
}