<?php
declare(strict_types=1);

require_once __DIR__ . '/_bootstrap.php';
admin_require_login();

const ADMIN_STATIC_MAPS_KEY = 'AIzaSyBrteucu_jnqE8DkFPU-Yn6Kjj-LP_N_aQ';

function admin_corrida_float(?array $row, string $key): ?float
{
    if (!$row || !isset($row[$key]) || trim((string) $row[$key]) === '') {
        return null;
    }

    return (float) str_replace(',', '.', (string) $row[$key]);
}

function admin_corridas_listar(int $limit = 80): array
{
    $stmt = db()->query(
        'SELECT c.id, c.status, c.valor, c.forma_pagamento, c.forma_pagamento_detalhe,
                c.categoria_veiculo, c.criada_em, c.aceita_em, c.cancelada_em, c.finalizada_em,
                p.nome AS passageiro_nome, m.nome AS motorista_nome
         FROM corridas c
         INNER JOIN usuarios p ON p.id = c.id_passageiro
         LEFT JOIN usuarios m ON m.id = c.id_motorista
         ORDER BY c.id DESC
         LIMIT ' . max(1, min(200, $limit))
    );

    return $stmt->fetchAll();
}

function admin_corrida_buscar(int $id): ?array
{
    if ($id <= 0) {
        return null;
    }

    $stmt = db()->prepare(
        'SELECT c.*,
                p.nome AS passageiro_nome, p.email AS passageiro_email, p.celular AS passageiro_celular,
                m.nome AS motorista_nome, m.email AS motorista_email, m.celular AS motorista_celular,
                v.marca AS veiculo_marca, v.modelo AS veiculo_modelo, v.cor AS veiculo_cor,
                v.placa AS veiculo_placa, v.ano_modelo AS veiculo_ano_modelo
         FROM corridas c
         INNER JOIN usuarios p ON p.id = c.id_passageiro
         LEFT JOIN usuarios m ON m.id = c.id_motorista
         LEFT JOIN veiculos v ON v.id = m.id_veiculo_ativo
         WHERE c.id = ?
         LIMIT 1'
    );
    $stmt->execute([$id]);
    $row = $stmt->fetch();

    return $row ?: null;
}

function admin_corrida_rota(int $id): array
{
    if ($id <= 0) {
        return [];
    }

    try {
        $pdo = db();
        $exists = $pdo->prepare(
            'SELECT COUNT(*)
             FROM INFORMATION_SCHEMA.TABLES
             WHERE TABLE_SCHEMA = DATABASE()
               AND TABLE_NAME = "corrida_pontos_rota"'
        );
        $exists->execute();
        if ((int) $exists->fetchColumn() === 0) {
            return [];
        }

        $stmt = $pdo->prepare(
            'SELECT lat, lng, rumo, velocidade, precisao, registrado_em
             FROM corrida_pontos_rota
             WHERE id_corrida = ?
             ORDER BY registrado_em ASC, id ASC'
        );
        $stmt->execute([$id]);
        return $stmt->fetchAll();
    } catch (Throwable) {
        return [];
    }
}

function admin_corrida_eventos(int $id): array
{
    if ($id <= 0) {
        return [];
    }

    try {
        $pdo = db();
        $exists = $pdo->prepare(
            'SELECT COUNT(*)
             FROM INFORMATION_SCHEMA.TABLES
             WHERE TABLE_SCHEMA = DATABASE()
               AND TABLE_NAME = "corrida_eventos"'
        );
        $exists->execute();
        if ((int) $exists->fetchColumn() === 0) {
            return [];
        }

        $stmt = $pdo->prepare(
            'SELECT ce.*, u.nome AS usuario_nome
             FROM corrida_eventos ce
             LEFT JOIN usuarios u ON u.id = ce.id_usuario
             WHERE ce.id_corrida = ?
             ORDER BY ce.criado_em ASC, ce.id ASC'
        );
        $stmt->execute([$id]);
        return $stmt->fetchAll();
    } catch (Throwable) {
        return [];
    }
}

function admin_corrida_ofertas(int $id): array
{
    if ($id <= 0) {
        return [];
    }

    try {
        $stmt = db()->prepare(
            'SELECT co.*, u.nome AS motorista_nome
             FROM corrida_ofertas co
             INNER JOIN usuarios u ON u.id = co.id_motorista
             WHERE co.id_corrida = ?
             ORDER BY co.rodada ASC, co.ordem ASC, co.enviado_em ASC'
        );
        $stmt->execute([$id]);
        return $stmt->fetchAll();
    } catch (Throwable) {
        return [];
    }
}

function admin_corrida_data_evento(array $corrida): string
{
    return (string) ($corrida['finalizada_em']
        ?? $corrida['cancelada_em']
        ?? $corrida['aceita_em']
        ?? $corrida['criada_em']
        ?? '');
}

function admin_corrida_status_label(string $status): string
{
    return match ($status) {
        'pendente' => 'Chamando',
        'aceita' => 'Aceita',
        'aguardando_embarque' => 'Aguardando embarque',
        'em_andamento' => 'Em andamento',
        'finalizada' => 'Finalizada',
        'cancelada' => 'Cancelada',
        default => $status,
    };
}

function admin_corrida_pagamento(array $corrida): string
{
    $detalhe = trim((string) ($corrida['forma_pagamento_detalhe'] ?? ''));
    $forma = trim((string) ($corrida['forma_pagamento'] ?? ''));
    return match ($detalhe !== '' ? $detalhe : $forma) {
        'dinheiro_pix', 'dinheiro' => 'Dinheiro/Pix',
        'pix_online' => 'Pix Online',
        'cartao_credito' => 'Cartão de crédito',
        'online' => 'Pagamento online',
        default => $forma !== '' ? $forma : 'Pagamento',
    };
}

function admin_corrida_amostrar_rota(array $pontos, int $limite = 80): array
{
    if (count($pontos) <= $limite) {
        return $pontos;
    }

    $out = [];
    $passo = (count($pontos) - 1) / max(1, $limite - 1);
    for ($i = 0; $i < $limite; $i++) {
        $out[] = $pontos[(int) round($i * $passo)];
    }
    return $out;
}

function admin_corrida_static_map_url(array $corrida, array $rota): ?string
{
    $origemLat = admin_corrida_float($corrida, 'origem_lat');
    $origemLng = admin_corrida_float($corrida, 'origem_lng');
    $destinoLat = admin_corrida_float($corrida, 'destino_lat');
    $destinoLng = admin_corrida_float($corrida, 'destino_lng');
    if ($origemLat === null || $origemLng === null || $destinoLat === null || $destinoLng === null) {
        return null;
    }

    $origem = $origemLat . ',' . $origemLng;
    $destino = $destinoLat . ',' . $destinoLng;
    $params = [
        'size=900x320',
        'scale=2',
        'maptype=roadmap',
        'markers=' . rawurlencode('color:green|label:E|' . $origem),
        'markers=' . rawurlencode('color:red|label:D|' . $destino),
    ];

    $amostra = admin_corrida_amostrar_rota($rota);
    if (count($amostra) >= 2) {
        $path = implode('|', array_map(static function (array $ponto): string {
            return (string) $ponto['lat'] . ',' . (string) $ponto['lng'];
        }, $amostra));
        $params[] = 'path=' . rawurlencode('color:0x1683F7FF|weight:5|' . $path);
    }

    $params[] = 'key=' . ADMIN_STATIC_MAPS_KEY;
    return 'https://maps.googleapis.com/maps/api/staticmap?' . implode('&', $params);
}

$idBusca = trim((string) ($_GET['id'] ?? ''));
$idCorrida = $idBusca === '' ? 0 : (int) preg_replace('/\D+/', '', $idBusca);
$corrida = $idCorrida > 0 ? admin_corrida_buscar($idCorrida) : null;
$rota = $corrida ? admin_corrida_rota((int) $corrida['id']) : [];
$eventos = $corrida ? admin_corrida_eventos((int) $corrida['id']) : [];
$ofertas = $corrida ? admin_corrida_ofertas((int) $corrida['id']) : [];
$recentes = $corrida ? [] : admin_corridas_listar();
$mapUrl = $corrida ? admin_corrida_static_map_url($corrida, $rota) : null;
$flash = admin_flash();
?>
<!doctype html>
<html lang="pt-BR">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Bulo Admin - Corridas</title>
  <link rel="stylesheet" href="assets/admin.css?v=20260626-1">
</head>
<body>
  <?php admin_sidebar('corridas'); ?>

  <main class="page">
    <?php if ($flash): ?><div class="flash <?= e($flash['type']) ?>"><?= e($flash['message']) ?></div><?php endif; ?>

    <section class="panel">
      <div class="panel-header">
        <h1>Corridas</h1>
        <p>Pesquise por ID para auditar status, motorista, passageiro, ofertas, eventos e rota real registrada.</p>
      </div>
      <div class="panel-body">
        <form class="filter-bar" method="get">
          <input type="search" name="id" placeholder="ID da corrida" value="<?= e($idBusca) ?>">
          <button class="button" type="submit">Pesquisar</button>
          <?php if ($idBusca !== ''): ?><a class="button secondary" href="corridas.php">Limpar</a><?php endif; ?>
        </form>
      </div>
    </section>

    <?php if ($idBusca !== '' && !$corrida): ?>
      <section class="panel"><div class="panel-body">Nenhuma corrida encontrada com esse ID.</div></section>
    <?php endif; ?>

    <?php if ($corrida): ?>
      <section class="metric-grid">
        <div class="stat-card stat-blue"><div><strong>#<?= e((string) $corrida['id']) ?></strong><span><?= e(admin_corrida_status_label((string) $corrida['status'])) ?></span><small><?= e(admin_corrida_data_evento($corrida)) ?></small></div></div>
        <div class="stat-card stat-green"><div><strong><?= e(admin_money((float) ($corrida['valor'] ?? 0))) ?></strong><span>Valor total</span><small><?= e(admin_corrida_pagamento($corrida)) ?></small></div></div>
        <div class="stat-card stat-orange"><div><strong><?= e((string) count($ofertas)) ?></strong><span>Ofertas</span><small>Motoristas acionados</small></div></div>
        <div class="stat-card stat-gold"><div><strong><?= e((string) count($rota)) ?></strong><span>Pontos de rota</span><small><?= count($rota) >= 2 ? 'Rota real registrada' : 'Sem rota real' ?></small></div></div>
      </section>

      <section class="panel">
        <div class="panel-header"><h1>Trajeto</h1><p><?= count($rota) >= 2 ? 'Caminho real registrado pelo GPS do motorista.' : 'Essa corrida ainda não possui pontos suficientes de rota real.' ?></p></div>
        <div class="panel-body">
          <?php if ($mapUrl): ?>
            <img class="ride-map" src="<?= e($mapUrl) ?>" alt="Mapa da corrida #<?= e((string) $corrida['id']) ?>">
          <?php else: ?>
            <div class="empty-state">Não ha coordenadas suficientes para exibir o mapa.</div>
          <?php endif; ?>
        </div>
      </section>

      <section class="detail-grid">
        <div class="panel">
          <div class="panel-header"><h1>Dados da corrida</h1></div>
          <div class="panel-body info-grid">
            <div><span>Passageiro</span><strong><?= e((string) $corrida['passageiro_nome']) ?></strong><small><?= e((string) $corrida['passageiro_email']) ?> | <?= e((string) $corrida['passageiro_celular']) ?></small></div>
            <div><span>Motorista</span><strong><?= e((string) ($corrida['motorista_nome'] ?? '--')) ?></strong><small><?= e((string) ($corrida['motorista_email'] ?? '')) ?> <?= e((string) ($corrida['motorista_celular'] ?? '')) ?></small></div>
            <div><span>Veículo</span><strong><?= e(trim((string) ($corrida['veiculo_marca'] ?? '') . ' ' . (string) ($corrida['veiculo_modelo'] ?? '')) ?: '--') ?></strong><small><?= e((string) ($corrida['veiculo_cor'] ?? '--')) ?> | Placa <?= e((string) ($corrida['veiculo_placa'] ?? '--')) ?></small></div>
            <div><span>Categoria</span><strong><?= e((string) ($corrida['categoria_veiculo'] ?? 'economica')) ?></strong></div>
            <div><span>Distância prevista</span><strong><?= e(number_format((float) ($corrida['distancia'] ?? 0), 2, ',', '.')) ?> km</strong></div>
            <div><span>Tempo estimado</span><strong><?= e((string) ($corrida['tempo_estimado'] ?? '--')) ?></strong></div>
            <div><span>Origem</span><strong><?= e((string) ($corrida['origem_endereco'] ?? '--')) ?></strong></div>
            <div><span>Destino</span><strong><?= e((string) ($corrida['destino_endereco'] ?? '--')) ?></strong></div>
          </div>
        </div>

        <div class="panel">
          <div class="panel-header"><h1>Cancelamento e avaliação</h1></div>
          <div class="panel-body info-grid">
            <div><span>Cancelada por</span><strong><?= e((string) ($corrida['cancelada_por'] ?? '--')) ?></strong></div>
            <div><span>Motivo</span><strong><?= e((string) ($corrida['cancelamento_motivo'] ?? '--')) ?></strong></div>
            <div><span>Taxa</span><strong><?= e(admin_money((float) ($corrida['cancelamento_taxa'] ?? 0))) ?></strong></div>
            <div><span>Motorista recebeu</span><strong><?= e(admin_money((float) ($corrida['cancelamento_valor_motorista'] ?? 0))) ?></strong></div>
            <div><span>Avaliação motorista</span><strong><?= e((string) ($corrida['avaliacao_motorista'] ?? '--')) ?></strong></div>
            <div><span>Avaliação passageiro</span><strong><?= e((string) ($corrida['avaliacao_passageiro'] ?? '--')) ?></strong></div>
          </div>
        </div>
      </section>

      <section class="detail-grid">
        <div class="panel">
          <div class="panel-header"><h1>Ofertas aos motoristas</h1></div>
          <div class="panel-body table-wrap">
            <table>
              <thead><tr><th>Motorista</th><th>Rodada</th><th>Ordem</th><th>Status</th><th>Distância</th><th>Enviado</th><th>Expira</th><th>Respondido</th></tr></thead>
              <tbody>
                <?php foreach ($ofertas as $oferta): ?>
                  <tr>
                    <td><?= e((string) $oferta['motorista_nome']) ?> <small>#<?= e((string) $oferta['id_motorista']) ?></small></td>
                    <td><?= e((string) $oferta['rodada']) ?></td>
                    <td><?= e((string) $oferta['ordem']) ?></td>
                    <td><span class="badge badge-muted"><?= e((string) $oferta['status']) ?></span></td>
                    <td><?= e(number_format((float) ($oferta['distancia_ate_origem_km'] ?? 0), 2, ',', '.')) ?> km</td>
                    <td><?= e((string) $oferta['enviado_em']) ?></td>
                    <td><?= e((string) $oferta['expira_em']) ?></td>
                    <td><?= e((string) ($oferta['respondido_em'] ?? '--')) ?></td>
                  </tr>
                <?php endforeach; ?>
                <?php if (!$ofertas): ?><tr><td colspan="8">Nenhuma oferta registrada.</td></tr><?php endif; ?>
              </tbody>
            </table>
          </div>
        </div>

        <div class="panel">
          <div class="panel-header"><h1>Linha do tempo</h1></div>
          <div class="panel-body table-wrap">
            <table>
              <thead><tr><th>Data</th><th>Evento</th><th>Usuário</th><th>Status</th><th>Motivo</th></tr></thead>
              <tbody>
                <?php foreach ($eventos as $evento): ?>
                  <tr>
                    <td><?= e((string) $evento['criado_em']) ?></td>
                    <td><strong><?= e((string) $evento['evento']) ?></strong><br><small><?= e((string) ($evento['observacao'] ?? '')) ?></small></td>
                    <td><?= e((string) ($evento['usuario_nome'] ?? '--')) ?><br><small><?= e((string) ($evento['tipo_usuario'] ?? '')) ?></small></td>
                    <td><?= e((string) ($evento['status_anterior'] ?? '--')) ?> &rarr; <?= e((string) ($evento['status_novo'] ?? '--')) ?></td>
                    <td><?= e((string) ($evento['motivo'] ?? '--')) ?></td>
                  </tr>
                <?php endforeach; ?>
                <?php if (!$eventos): ?><tr><td colspan="5">Nenhum evento registrado ainda.</td></tr><?php endif; ?>
              </tbody>
            </table>
          </div>
        </div>
      </section>
    <?php else: ?>
      <section class="panel">
        <div class="panel-header"><h1>Corridas recentes</h1></div>
        <div class="panel-body table-wrap">
          <table>
            <thead><tr><th>ID</th><th>Passageiro</th><th>Motorista</th><th>Status</th><th>Valor</th><th>Pagamento</th><th>Data</th><th></th></tr></thead>
            <tbody>
              <?php foreach ($recentes as $item): ?>
                <tr>
                  <td>#<?= e((string) $item['id']) ?></td>
                  <td><?= e((string) $item['passageiro_nome']) ?></td>
                  <td><?= e((string) ($item['motorista_nome'] ?? '--')) ?></td>
                  <td><span class="badge badge-muted"><?= e(admin_corrida_status_label((string) $item['status'])) ?></span></td>
                  <td><?= e(admin_money((float) ($item['valor'] ?? 0))) ?></td>
                  <td><?= e(admin_corrida_pagamento($item)) ?></td>
                  <td><?= e(admin_corrida_data_evento($item)) ?></td>
                  <td><a class="button secondary" href="corridas.php?id=<?= e((string) $item['id']) ?>">Ver</a></td>
                </tr>
              <?php endforeach; ?>
            </tbody>
          </table>
        </div>
      </section>
    <?php endif; ?>
  </main>
</body>
</html>
