<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/helpers.php';

$lat = payload_float($_GET, ['lat', 'latitude']);
$lng = payload_float($_GET, ['lng', 'longitude']);

if ($lat === null || $lng === null) {
    json_fail('Localizacao nao informada.');
}

if ($lat < -90 || $lat > 90 || $lng < -180 || $lng > 180) {
    json_fail('Localizacao invalida.');
}

$limite = max(1, min(8, (int) ($_GET['limite'] ?? 5)));
$raioKm = max(1.0, min(15.0, (float) str_replace(',', '.', (string) ($_GET['raio_km'] ?? '5'))));

$pdo = db();
$distanciaSql = '(6371 * ACOS(LEAST(1, GREATEST(-1,
    COS(RADIANS(?)) * COS(RADIANS(u.ultimo_lat)) *
    COS(RADIANS(u.ultimo_lng) - RADIANS(?)) +
    SIN(RADIANS(?)) * SIN(RADIANS(u.ultimo_lat))
))))';

$stmt = $pdo->prepare(
    'SELECT
        u.id,
        u.ultimo_lat AS lat,
        u.ultimo_lng AS lng,
        COALESCE(u.ultimo_rumo, 0) AS rumo,
        TIMESTAMPDIFF(SECOND, u.localizacao_atualizada_em, NOW()) AS idade_segundos,
        ' . $distanciaSql . ' AS distancia_km
     FROM usuarios u
     WHERE u.tipo = "motorista"
       AND u.disponivel = "sim"
       AND u.ultimo_lat IS NOT NULL
       AND u.ultimo_lng IS NOT NULL
       AND u.localizacao_atualizada_em >= DATE_SUB(NOW(), INTERVAL 2 MINUTE)
       AND EXISTS (
         SELECT 1
         FROM veiculos v
         WHERE v.id_motorista = u.id
           AND v.status = "aprovado"
           AND (u.id_veiculo_ativo IS NULL OR v.id = u.id_veiculo_ativo)
       )
     HAVING distancia_km <= ?
     ORDER BY distancia_km ASC
     LIMIT ' . $limite
);
$stmt->execute([$lat, $lng, $lat, $raioKm]);

$motoristas = array_map(static function (array $row): array {
    return [
        'id' => (int) $row['id'],
        'lat' => (float) $row['lat'],
        'lng' => (float) $row['lng'],
        'rumo' => (float) ($row['rumo'] ?? 0),
        'distancia_km' => round((float) $row['distancia_km'], 2),
        'idade_segundos' => $row['idade_segundos'] === null ? null : (int) $row['idade_segundos'],
    ];
}, $stmt->fetchAll());

json_ok([
    'motoristas' => $motoristas,
    'limite' => $limite,
    'raio_km' => $raioKm,
]);
