<?php
declare(strict_types=1);

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

$data = input_json();
$idPassageiro = (int) ($_GET['id_passageiro'] ?? $_GET['id_usuario'] ?? $data['id_passageiro'] ?? $data['id_usuario'] ?? 0);

if ($idPassageiro <= 0) {
    json_fail('Passageiro nao informado.');
}

try {
    $pdo = db();
    $usuarioStmt = $pdo->prepare('SELECT id, nome FROM usuarios WHERE id = ? LIMIT 1');
    $usuarioStmt->execute([$idPassageiro]);
    if (!$usuarioStmt->fetch()) {
        json_fail('Passageiro nao encontrado.', 404);
    }

    $stmt = $pdo->prepare(
        'SELECT c.id, c.id_motorista, c.origem_lat, c.origem_lng, c.destino_lat, c.destino_lng,
                c.origem_endereco, c.destino_endereco, c.distancia, c.tempo_estimado, c.valor,
                c.saldo_negativo_cobrado, c.categoria_veiculo, c.forma_pagamento, c.forma_pagamento_detalhe,
                c.status, c.cancelada_por, c.cancelamento_motivo, c.cancelamento_observacao,
                c.cancelamento_taxa, c.cancelamento_valor_motorista, c.distancia_motorista_cancelamento_km,
                c.avaliacao_motorista, c.avaliacao_comentario, c.criada_em, c.aceita_em,
                c.chegou_embarque_em, c.iniciou_viagem_em, c.cancelada_em, c.finalizada_em, c.atualizada_em,
                m.nome AS motorista_nome, m.foto_url AS motorista_foto,
                v.marca AS veiculo_marca, v.modelo AS veiculo_modelo, v.cor AS veiculo_cor, v.placa AS veiculo_placa
         FROM corridas c
         LEFT JOIN usuarios m ON m.id = c.id_motorista
         LEFT JOIN veiculos v ON v.id = m.id_veiculo_ativo
         WHERE c.id_passageiro = ?
         ORDER BY c.criada_em DESC, c.id DESC
         LIMIT 120'
    );
    $stmt->execute([$idPassageiro]);
    $rows = $stmt->fetchAll();

    $rotas = [];
    $idsCorridas = array_values(array_unique(array_map(
        static fn(array $row): int => (int) $row['id'],
        $rows
    )));
    if ($idsCorridas && corrida_table_exists($pdo, 'corrida_pontos_rota')) {
        $placeholders = implode(',', array_fill(0, count($idsCorridas), '?'));
        $rotasStmt = $pdo->prepare(
            'SELECT id_corrida, lat, lng, rumo, velocidade, precisao, registrado_em
             FROM corrida_pontos_rota
             WHERE id_corrida IN (' . $placeholders . ')
             ORDER BY id_corrida ASC, registrado_em ASC, id ASC'
        );
        $rotasStmt->execute($idsCorridas);
        foreach ($rotasStmt->fetchAll() as $ponto) {
            $id = (int) $ponto['id_corrida'];
            $rotas[$id][] = [
                'lat' => (float) $ponto['lat'],
                'lng' => (float) $ponto['lng'],
                'rumo' => $ponto['rumo'] === null ? null : (float) $ponto['rumo'],
                'velocidade' => $ponto['velocidade'] === null ? null : (float) $ponto['velocidade'],
                'precisao' => $ponto['precisao'] === null ? null : (float) $ponto['precisao'],
                'registrado_em' => $ponto['registrado_em'],
            ];
        }
    }

    $corridas = [];
    foreach ($rows as $row) {
        $rotaPontos = $rotas[(int) $row['id']] ?? [];
        $row['id'] = (int) $row['id'];
        $row['id_motorista'] = $row['id_motorista'] === null ? null : (int) $row['id_motorista'];
        $row['valor'] = $row['valor'] === null ? 0.0 : round((float) $row['valor'], 2);
        $row['distancia'] = $row['distancia'] === null ? 0.0 : round((float) $row['distancia'], 2);
        $row['saldo_negativo_cobrado'] = round((float) ($row['saldo_negativo_cobrado'] ?? 0), 2);
        $row['cancelamento_taxa'] = round((float) ($row['cancelamento_taxa'] ?? 0), 2);
        $row['cancelamento_valor_motorista'] = round((float) ($row['cancelamento_valor_motorista'] ?? 0), 2);
        $row['distancia_motorista_cancelamento_km'] = $row['distancia_motorista_cancelamento_km'] === null
            ? null
            : round((float) $row['distancia_motorista_cancelamento_km'], 3);
        $row['rota_pontos'] = $rotaPontos;
        $corridas[] = $row;
    }

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