<?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 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 {
    // ---------------- FIREBIRD ----------------
    $dsn = "firebird:dbname=localhost:C:\Program Files (x86)\Common Files\Aspel\Sistemas Aspel\SAE7.00\Ejemplos\Ejemplos2.fdb;charset=UTF8";
    $pdo = new PDO($dsn, 'SYSDBA', 'masterkey', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);

    // ---------------- MYSQL ----------------
    $pdoMy = new PDO("mysql:host=localhost;dbname=rastreo;charset=utf8mb4", "root", "root", [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);

    $hoy = date('Y-m-d');

    // ---------------- CONSULTA FIREBIRD ----------------
    $sql = "
        SELECT 
            f.CVE_DOC, 
            f.TIP_DOC_SIG, 
            f.DOC_SIG, 
            f.NUM_ALMA,
            a.CVE_ALM,
            a.DESCR AS ALMACEN,
            c.CLAVE, 
            c.NOMBRE,
            c.CALLE_ENVIO, 
            c.NUMEXT_ENVIO, 
            c.NUMINT_ENVIO, 
            c.CRUZAMIENTOS_ENVIO, 
            c.CRUZAMIENTOS_ENVIO2,
            c.COLONIA_ENVIO, 
            c.LOCALIDAD_ENVIO, 
            c.MUNICIPIO_ENVIO, 
            c.ESTADO_ENVIO, 
            c.PAIS_ENVIO, 
            c.CODIGO_ENVIO,
            f.FECHA_ENT
        FROM FACTP01 f
        JOIN CLIE01 c ON f.CVE_CLPV = c.CLAVE
        JOIN ALMACENES01 a ON f.NUM_ALMA = a.CVE_ALM
        WHERE CAST(f.FECHA_ENT AS DATE) = CAST(:hoy AS DATE)
        ORDER BY f.CVE_DOC
    ";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':hoy' => $hoy]);
    $pedidos = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // 🔹 Pedidos ya asignados
    $stmtRutas = $pdoMy->query("SELECT pedido_id FROM rutas");
    $pedidosAsignados = $stmtRutas->fetchAll(PDO::FETCH_COLUMN);

    // 🔹 Consulta preparada para buscar coordenadas por nombre
    $checkUbicacion = $pdoMy->prepare("SELECT lat, lng FROM nuevasubicaciones WHERE nombre = ?");
    $insertUbicacion = $pdoMy->prepare("INSERT INTO nuevasubicaciones (nombre, lat, lng) VALUES (?, ?, ?)");

    $marcadores = [];

    foreach ($pedidos as $p) {
        if (in_array($p['CVE_DOC'], $pedidosAsignados)) {
            continue;
        }

        // 🏠 Construir dirección completa
        $street = trim($p['CALLE_ENVIO'] ?? '');
        $cruce1 = trim($p['CRUZAMIENTOS_ENVIO'] ?? '');
        $cruce2 = trim($p['CRUZAMIENTOS_ENVIO2'] ?? '');
        if ($cruce1 && $cruce2) {
            $street .= " & $cruce1 & $cruce2";
        } elseif ($cruce1) {
            $street .= " & $cruce1";
        } elseif ($cruce2) {
            $street .= " & $cruce2";
        }

        $direccion = trim($street . ', ' . ($p['COLONIA_ENVIO'] ?? '') . ', ' .
            ($p['LOCALIDAD_ENVIO'] ?: $p['MUNICIPIO_ENVIO']) . ', ' .
            ($p['ESTADO_ENVIO'] ?? '') . ', ' .
            ($p['PAIS_ENVIO'] ?? ''));

        // 🔍 Buscar coordenadas por nombre de cliente en MySQL
        $nombreCliente = trim($p['NOMBRE']);
        $lat = null;
        $lon = null;

        $checkUbicacion->execute([$nombreCliente]);
        $ubicacion = $checkUbicacion->fetch(PDO::FETCH_ASSOC);

        if ($ubicacion && $ubicacion['lat'] && $ubicacion['lng']) {
            // ✅ Coordenadas encontradas
            $lat = $ubicacion['lat'];
            $lon = $ubicacion['lng'];
        } else {
            // ⚙️ No existen → obtener desde Nominatim
            $coords = getCoordinates($direccion);
            $lat = $coords['lat'];
            $lon = $coords['lng'];

            // 💾 Guardar si se obtuvieron correctamente
            if ($lat && $lon) {
                $insertUbicacion->execute([$nombreCliente, $lat, $lon]);
            }
        }

        $marcadores[] = [
            'pedido'      => $p['CVE_DOC'],
            'cliente'     => $nombreCliente,
            'cliente_id'  => $p['CLAVE'],
            'NUM_ALMA'    => $p['NUM_ALMA'],
            'direccion'   => $direccion,
            'calle'       => $street,
            'colonia'     => $p['COLONIA_ENVIO'],
            'localidad'   => $p['LOCALIDAD_ENVIO'],
            'municipio'   => $p['MUNICIPIO_ENVIO'],
            'estado'      => $p['ESTADO_ENVIO'],
            'pais'        => $p['PAIS_ENVIO'],
            'postalcode'  => $p['CODIGO_ENVIO'],
            'tip_doc_sig' => $p['TIP_DOC_SIG'],
            'doc_sig'     => $p['DOC_SIG'],
            'almacenes'   => $p['ALMACEN'],
            'fecha_ent'   => $p['FECHA_ENT'],
            'lat'         => $lat,
            'lon'         => $lon
        ];
    }

    echo json_encode($marcadores, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

} catch (PDOException $e) {
    echo json_encode(['error' => $e->getMessage()]);
}
