<?php
header('Content-Type: application/json; charset=utf-8');
error_reporting(E_ALL);
ini_set('display_errors', 1);

/**
 * Función auxiliar: obtener coordenadas desde Nominatim si no hay registro en MySQL
 */
function getCoordinates($direccion)
{
    $url = "https://nominatim.openstreetmap.org/search?q=" . urlencode($direccion) . "&format=json&limit=1";

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "LogisticaApp/1.0");
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        $error = curl_error($ch);
        curl_close($ch);
        return ["lat" => null, "lng" => null, "error_geo" => $error];
    }

    curl_close($ch);
    $geo = json_decode($response, true);
    return [
        "lat" => $geo && count($geo) > 0 ? $geo[0]['lat'] : null,
        "lng" => $geo && count($geo) > 0 ? $geo[0]['lon'] : null,
        "error_geo" => null
    ];
}

try {
    /* 🔹 Conexión Firebird (SAE) */
    $dsn = "firebird:dbname=localhost:C:\Program Files (x86)\Common Files\Aspel\Sistemas Aspel\SAE7.00\Ejemplos\Ejemplos2.fdb;charset=UTF8";
    $fb = new PDO($dsn, 'SYSDBA', 'masterkey', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);

    /* 🔹 Conexión MySQL (rastreo) */
    $mysql = new mysqli('localhost', 'root', 'root', 'rastreo');
    if ($mysql->connect_errno) {
        throw new Exception('Error de conexión a MySQL: ' . $mysql->connect_error);
    }

    /* 🔹 Consulta principal de almacenes */
    $stmt = $fb->query("SELECT CVE_ALM, DESCR, DIRECCION FROM ALMACENES01 ORDER BY CVE_ALM");
    $almacenes = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (!$almacenes) {
        echo json_encode(["error" => "No se encontraron registros en ALMACENES01"]);
        exit;
    }

    $resultado = [];

    /* 🔹 Preparar consulta en MySQL para ver si ya existe la ubicación */
    $checkUbicacion = $mysql->prepare("SELECT lat, lng FROM nuevasubicaciones WHERE nombre = ?");

    foreach ($almacenes as $almacen) {
        $nombre = trim($almacen['DESCR']);
        $lat = null;
        $lng = null;

        // Buscar primero en MySQL
        $checkUbicacion->bind_param('s', $nombre);
        $checkUbicacion->execute();
        $res = $checkUbicacion->get_result();
        $ubicacion = $res->fetch_assoc();

        if ($ubicacion && $ubicacion['lat'] && $ubicacion['lng']) {
            // ✅ Ya existe en la base externa
            $lat = $ubicacion['lat'];
            $lng = $ubicacion['lng'];
        } else {
            // ⚙️ No existe, obtener coordenadas desde dirección (Nominatim)
            $coords = getCoordinates($almacen['DIRECCION']);
            $lat = $coords['lat'];
            $lng = $coords['lng'];
        }

        $resultado[] = [
            "CVE_ALM" => $almacen['CVE_ALM'],
            "DESCR" => $nombre,
            "DIRECCION" => $almacen['DIRECCION'],
            "lat" => $lat !== null ? (float) str_replace(',', '.', $lat) : 0,
            "lng" => $lng !== null ? (float) str_replace(',', '.', $lng) : 0

        ];
    }

    echo json_encode($resultado, JSON_PRETTY_PRINT);

    $checkUbicacion->close();
    $mysql->close();

} catch (PDOException $e) {
    echo json_encode(["error_firebird" => $e->getMessage()]);
} catch (Exception $e) {
    echo json_encode(["error_general" => $e->getMessage()]);
}
