<?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;
    if ($idMotorista <= 0) {
        json_fail('Motorista nao informado.');
    }

    motorista_atualizar_localizacao($idMotorista, $_GET);

    $statusStmt = $pdo->prepare(
        'SELECT u.tipo, u.cnh_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 pode receber corridas.', 403);
    }
    if (($motorista['disponivel'] ?? 'nao') !== 'sim') {
        json_ok(['oferta' => null]);
    }

    if (!corrida_ofertas_ativas($pdo)) {
        json_ok(['oferta' => null]);
    }

    corrida_ofertas_processar_pendentes($pdo);

    $stmt = $pdo->prepare(
        'SELECT co.id AS oferta_id, co.id_corrida
         FROM corrida_ofertas co
         INNER JOIN corridas c ON c.id = co.id_corrida
         WHERE co.id_motorista = ?
           AND co.status = "pendente"
           AND co.expira_em > NOW()
           AND c.status = "pendente"
           AND (COALESCE(c.forma_pagamento, "dinheiro") <> "online" OR COALESCE(c.status_pagamento, "") = "aprovado")
         ORDER BY co.expira_em ASC
         LIMIT 1'
    );
    $stmt->execute([$idMotorista]);
    $oferta = $stmt->fetch();

    if (!$oferta) {
        json_ok(['oferta' => null]);
    }

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

    $corrida = corrida_formatar_para_motorista(
        $pdo,
        (int) $oferta['id_corrida'],
        (int) $oferta['oferta_id'],
        $lat !== null && $lng !== null ? ['lat' => $lat, 'lng' => $lng] : null
    );

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