<?php
declare(strict_types=1);

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

try {
    $pdo = db();
    $idMotorista = isset($_GET['id_motorista']) ? (int) $_GET['id_motorista'] : 0;
    $motoristaLocal = null;
    if ($idMotorista > 0) {
        motorista_atualizar_localizacao($idMotorista, $_GET);

        $statusStmt = $pdo->prepare(
            'SELECT u.tipo, u.cnh_status, u.documento_veiculo_status, u.selfie_status, u.disponivel,
                    u.ultimo_lat, u.ultimo_lng,
                    EXISTS(SELECT 1 FROM veiculos v WHERE v.id_motorista = u.id AND v.status = "aprovado") AS tem_veiculo_aprovado
             FROM usuarios u
             WHERE u.id = ? LIMIT 1'
        );
        $statusStmt->execute([$idMotorista]);
        $motorista = $statusStmt->fetch();

        if (!$motorista || $motorista['tipo'] !== 'motorista') {
            json_fail('Motorista nao encontrado.', 404);
        }

        if (!motorista_pode_ficar_online($motorista)) {
            json_fail('Motorista ainda nao tem todos os documentos aprovados para receber corridas.', 403, [
                'cnh_status' => $motorista['cnh_status'] ?? 'pendente',
                'documento_veiculo_status' => $motorista['documento_veiculo_status'] ?? 'pendente',
                'selfie_status' => $motorista['selfie_status'] ?? 'pendente',
                'tem_veiculo_aprovado' => (bool) ($motorista['tem_veiculo_aprovado'] ?? false),
            ]);
        }

        if (($motorista['disponivel'] ?? 'nao') !== 'sim') {
            json_fail('Motorista offline.', 403, [
                'disponivel' => $motorista['disponivel'] ?? 'nao',
            ]);
        }

        $lat = payload_float($_GET, ['lat', 'latitude', 'ultimo_lat']);
        $lng = payload_float($_GET, ['lng', 'longitude', 'ultimo_lng']);
        if ($lat === null) {
            $lat = $motorista['ultimo_lat'] === null ? null : (float) $motorista['ultimo_lat'];
        }
        if ($lng === null) {
            $lng = $motorista['ultimo_lng'] === null ? null : (float) $motorista['ultimo_lng'];
        }
        if ($lat !== null && $lng !== null) {
            $motoristaLocal = ['lat' => $lat, 'lng' => $lng];
        }
    }

    corrida_ofertas_processar_pendentes($pdo);

    $filtroLista = corrida_schema_column_exists($pdo, 'corridas', 'oferta_lista_liberada')
        ? 'AND c.oferta_lista_liberada = 1'
        : '';
    $filtroPagamentoLiberado = corrida_schema_column_exists($pdo, 'corridas', 'status_pagamento')
        && corrida_schema_column_exists($pdo, 'corridas', 'forma_pagamento')
        ? 'AND (COALESCE(c.forma_pagamento, "dinheiro") <> "online" OR COALESCE(c.status_pagamento, "") = "aprovado")'
        : '';
    $filtroCategoriaMotorista = '';
    $paramsCategoriaMotorista = [];
    if ($idMotorista > 0 && corrida_schema_column_exists($pdo, 'corridas', 'categoria_veiculo')) {
        $filtroCategoriaMotorista = '
                  AND EXISTS (
                    SELECT 1
                    FROM usuarios mu
                    INNER JOIN veiculos mv
                      ON mv.id = mu.id_veiculo_ativo
                     AND mv.id_motorista = mu.id
                     AND mv.status = "aprovado"
                    LEFT JOIN veiculo_modelos_catalogo mvm ON mvm.id = mv.id_modelo_catalogo
                    WHERE mu.id = ?
                      AND (
                        COALESCE(c.categoria_veiculo, "economica") = "economica"
                        OR (c.categoria_veiculo = "plus" AND COALESCE(mvm.categoria_plus, 0) = 1)
                        OR (c.categoria_veiculo = "pro" AND COALESCE(mvm.categoria_pro, 0) = 1)
                      )
                  )';
        $paramsCategoriaMotorista = [$idMotorista];
    }

    if ($motoristaLocal !== null) {
        $distanciaSql = '(6371 * ACOS(LEAST(1, GREATEST(-1,
            COS(RADIANS(?)) * COS(RADIANS(c.origem_lat)) *
            COS(RADIANS(c.origem_lng) - RADIANS(?)) +
            SIN(RADIANS(?)) * SIN(RADIANS(c.origem_lat))
        ))))';
        $sql = 'SELECT c.id, ' . $distanciaSql . ' AS distancia_ate_origem_km
                FROM corridas c
                WHERE c.status = "pendente"
                  AND c.origem_lat IS NOT NULL
                  AND c.origem_lng IS NOT NULL
                  ' . $filtroLista . '
                  ' . $filtroPagamentoLiberado . '
                  ' . $filtroCategoriaMotorista . '
                HAVING distancia_ate_origem_km <= ?
                ORDER BY c.criada_em ASC';
        $params = [
            $motoristaLocal['lat'],
            $motoristaLocal['lng'],
            $motoristaLocal['lat'],
            ...$paramsCategoriaMotorista,
            CORRIDA_LISTA_RAIO_KM,
        ];
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $rows = $stmt->fetchAll();
    } else {
        $stmt = $pdo->prepare(
            'SELECT c.id
             FROM corridas c
             WHERE c.status = "pendente"
             ' . $filtroLista . '
             ' . $filtroPagamentoLiberado . '
             ' . $filtroCategoriaMotorista . '
             ORDER BY c.criada_em ASC'
        );
        $stmt->execute($paramsCategoriaMotorista);
        $rows = $stmt->fetchAll();
    }

    $corridas = [];
    $corridaBrutaStmt = $pdo->prepare('SELECT * FROM corridas WHERE id = ? LIMIT 1');
    foreach ($rows as $row) {
        if ($idMotorista > 0) {
            $corridaBrutaStmt->execute([(int) $row['id']]);
            $corridaBruta = $corridaBrutaStmt->fetch();
            if (!$corridaBruta || !corrida_motorista_pode_receber_corrida($pdo, [
                'id' => $idMotorista,
                'lat' => $motoristaLocal['lat'] ?? null,
                'lng' => $motoristaLocal['lng'] ?? null,
            ], $corridaBruta)) {
                continue;
            }
        }

        $corrida = corrida_formatar_para_motorista($pdo, (int) $row['id'], null, $motoristaLocal);
        if ($corrida) {
            $corridas[] = $corrida;
        }
    }

    json_ok(['corridas' => $corridas]);
} catch (Throwable $e) {
    json_fail('Erro ao listar corridas.', 500, ['error' => $e->getMessage()]);
}
