<?php
declare(strict_types=1);

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

$hoje = new DateTimeImmutable('today');
$periodos = ['dia', 'semana', 'mes', 'ano', 'total'];
$periodo = strtolower(trim((string) ($_GET['periodo'] ?? 'mes')));
if (!in_array($periodo, $periodos, true)) {
    $periodo = 'mes';
}

$dataSelecionada = admin_indicacoes_parse_data((string) ($_GET['data'] ?? ''), $hoje);
$semanaSelecionada = admin_indicacoes_parse_semana((string) ($_GET['semana'] ?? ''), $dataSelecionada);
$mesSelecionado = admin_indicacoes_parse_mes((string) ($_GET['mes'] ?? ''), $hoje);
$anoSelecionado = admin_indicacoes_parse_ano((string) ($_GET['ano'] ?? ''), $hoje);
$inicio = null;
$fim = null;
$periodoLabel = 'Total geral';

if ($periodo === 'dia') {
    $inicioDt = $dataSelecionada;
    $fimDt = $inicioDt->modify('+1 day');
    $inicio = $inicioDt->format('Y-m-d 00:00:00');
    $fim = $fimDt->format('Y-m-d 00:00:00');
    $periodoLabel = 'Dia ' . $inicioDt->format('d/m/Y');
} elseif ($periodo === 'semana') {
    $inicioDt = $semanaSelecionada;
    $fimDt = $inicioDt->modify('+7 days');
    $inicio = $inicioDt->format('Y-m-d 00:00:00');
    $fim = $fimDt->format('Y-m-d 00:00:00');
    $periodoLabel = 'Semana ' . $inicioDt->format('d/m/Y') . ' a ' . $fimDt->modify('-1 day')->format('d/m/Y');
} elseif ($periodo === 'mes') {
    $inicioDt = $mesSelecionado;
    $fimDt = $inicioDt->modify('+1 month');
    $inicio = $inicioDt->format('Y-m-01 00:00:00');
    $fim = $fimDt->format('Y-m-01 00:00:00');
    $periodoLabel = 'Mês ' . $inicioDt->format('m/Y');
} elseif ($periodo === 'ano') {
    $inicioDt = $anoSelecionado;
    $fimDt = $inicioDt->modify('+1 year');
    $inicio = $inicioDt->format('Y-01-01 00:00:00');
    $fim = $fimDt->format('Y-01-01 00:00:00');
    $periodoLabel = 'Ano ' . $inicioDt->format('Y');
}

$resumo = admin_indicacoes_resumo($inicio, $fim);
$ranking = admin_indicacoes_ranking($inicio, $fim);
$indicados = admin_indicacoes_indicados($inicio, $fim);
$corridas = admin_indicacoes_corridas($inicio, $fim);
$mensal = admin_indicacoes_mensal();
$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 - Indicações</title>
  <link rel="stylesheet" href="assets/admin.css?v=20260626-1">
</head>
<body>
  <?php admin_sidebar('indicacoes'); ?>

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

    <section class="panel filter-panel">
      <div class="panel-header">
        <h1>Indicações</h1>
        <p>Controle geral de códigos, cadastros indicados e valores estimados de repasse. Mostrando <?= e($periodoLabel) ?>.</p>
      </div>
      <div class="panel-body">
        <form class="period-form" method="get" action="indicacoes.php">
          <div class="period-tabs" role="group" aria-label="Período de visualização">
            <?php foreach (['dia' => 'Dia', 'semana' => 'Semana', 'mes' => 'Mensal', 'ano' => 'Anual', 'total' => 'Total'] as $valor => $label): ?>
              <label class="period-pill <?= $periodo === $valor ? 'active' : '' ?>">
                <input type="radio" name="periodo" value="<?= e($valor) ?>" <?= $periodo === $valor ? 'checked' : '' ?>>
                <?= e($label) ?>
              </label>
            <?php endforeach; ?>
          </div>

          <div class="filter-fields">
            <div class="field period-field" data-period-field="dia">
              <label for="data">Dia</label>
              <input id="data" name="data" type="date" value="<?= e($dataSelecionada->format('Y-m-d')) ?>">
            </div>
            <div class="field period-field" data-period-field="semana">
              <label for="semana">Semana</label>
              <input id="semana" name="semana" type="week" value="<?= e($semanaSelecionada->format('o-\WW')) ?>">
            </div>
            <div class="field period-field" data-period-field="mes">
              <label for="mes">Mês</label>
              <input id="mes" name="mes" type="month" value="<?= e($mesSelecionado->format('Y-m')) ?>">
            </div>
            <div class="field period-field" data-period-field="ano">
              <label for="ano">Ano</label>
              <input id="ano" name="ano" type="number" min="2000" max="2100" step="1" inputmode="numeric" value="<?= e($anoSelecionado->format('Y')) ?>">
            </div>
            <button class="button" type="submit">Aplicar filtro</button>
          </div>
        </form>
      </div>
    </section>

    <section class="metric-grid">
      <div class="stat-card stat-blue">
        <div><strong><?= e((string) $resumo['total_indicados']) ?></strong><span>Cadastros indicados</span><small><?= e((string) $resumo['passageiros_indicados']) ?> passageiros | <?= e((string) $resumo['motoristas_indicados']) ?> motoristas</small></div>
      </div>
      <div class="stat-card stat-green">
        <div><strong><?= e(admin_money((float) $resumo['repasses_total'])) ?></strong><span>Repasses estimados</span><small>No período selecionado</small></div>
      </div>
      <div class="stat-card stat-gold">
        <div><strong><?= e(admin_money((float) $resumo['repasse_motoristas'])) ?></strong><span>Indicador motorista</span><small>2,5% das corridas de motoristas indicados</small></div>
      </div>
      <div class="stat-card stat-orange">
        <div><strong><?= e(admin_money((float) $resumo['repasse_passageiros'])) ?></strong><span>Indicador passageiro</span><small>1,5% das corridas de passageiros indicados</small></div>
      </div>
      <div class="stat-card stat-red">
        <div><strong><?= e(admin_money((float) $resumo['sobra_sem_indicacao'])) ?></strong><span>Sobra sem indicação</span><small>Percentual sem indicador vinculado</small></div>
      </div>
      <div class="stat-card stat-blue">
        <div><strong><?= e((string) $resumo['indicadores_ativos']) ?></strong><span>Indicadores ativos</span><small><?= e((string) $resumo['codigos_disponiveis']) ?> codigos cadastrados</small></div>
      </div>
    </section>

    <section class="dashboard-row">
      <div class="panel">
        <div class="panel-header">
          <h1>Ranking de indicadores</h1>
          <p>Valores estimados considerando corridas finalizadas no período selecionado.</p>
        </div>
        <div class="panel-body table-wrap">
          <table>
            <thead>
              <tr>
                <th>Indicador</th>
                <th>Código</th>
                <th>Indicados</th>
                <th>Corridas</th>
                <th>Valor gerado</th>
                <th>Repasse</th>
              </tr>
            </thead>
            <tbody>
              <?php foreach ($ranking as $r): ?>
                <tr>
                  <td><strong><?= e((string) $r['nome']) ?></strong><br><small><?= e((string) $r['tipo']) ?></small></td>
                  <td><?= e((string) $r['codigoind']) ?></td>
                  <td><?= e((string) $r['total_indicados']) ?><br><small><?= e((string) $r['passageiros_indicados']) ?> pass. | <?= e((string) $r['motoristas_indicados']) ?> mot.</small></td>
                  <td><?= e((string) ($r['corridas_motoristas'] + $r['corridas_passageiros'])) ?></td>
                  <td><?= e(admin_money((float) ($r['valor_motoristas'] + $r['valor_passageiros']))) ?></td>
                  <td><?= e(admin_money((float) ($r['repasse_motoristas'] + $r['repasse_passageiros']))) ?><br><small><?= e(admin_money((float) $r['repasse_motoristas'])) ?> mot. | <?= e(admin_money((float) $r['repasse_passageiros'])) ?> pass.</small></td>
                </tr>
              <?php endforeach; ?>
              <?php if (!$ranking): ?><tr><td colspan="6">Nenhum indicador encontrado.</td></tr><?php endif; ?>
            </tbody>
          </table>
        </div>
      </div>

      <div class="panel">
        <div class="panel-header">
          <h1>Evolucao mensal</h1>
          <p>Últimos mêses com corridas indicadas.</p>
        </div>
        <div class="panel-body table-wrap">
          <table>
            <thead><tr><th>Mês</th><th>Corridas</th><th>Repasse</th><th>Sobra</th></tr></thead>
            <tbody>
              <?php foreach ($mensal as $m): ?>
                <tr>
                  <td><?= e((string) $m['mes']) ?></td>
                  <td><?= e((string) $m['corridas']) ?></td>
                  <td><?= e(admin_money((float) $m['repasses'])) ?></td>
                  <td><?= e(admin_money((float) $m['sobra'])) ?></td>
                </tr>
              <?php endforeach; ?>
              <?php if (!$mensal): ?><tr><td colspan="4">Sem dados mensais.</td></tr><?php endif; ?>
            </tbody>
          </table>
        </div>
      </div>
    </section>

    <section class="panel" style="margin-bottom:16px;">
      <div class="panel-header">
        <h1>Cadastros indicados</h1>
        <p>Quem entrou por indicação e quanto gerou no período selecionado.</p>
      </div>
      <div class="panel-body table-wrap">
        <table>
          <thead>
            <tr>
              <th>Indicado</th>
              <th>Tipo</th>
              <th>Indicador</th>
              <th>Corridas</th>
              <th>Valor gerado</th>
              <th>Repasse estimado</th>
              <th>Criado em</th>
            </tr>
          </thead>
          <tbody>
            <?php foreach ($indicados as $i): ?>
              <tr>
                <td><strong><?= e((string) $i['nome']) ?></strong><br><small><?= e((string) $i['email']) ?></small></td>
                <td><?= e((string) $i['tipo']) ?></td>
                <td><?= e((string) ($i['indicador_nome'] ?? '--')) ?><br><small><?= e((string) $i['indicador_codigo']) ?></small></td>
                <td><?= e((string) $i['corridas_periodo']) ?></td>
                <td><?= e(admin_money((float) $i['valor_periodo'])) ?></td>
                <td><?= e(admin_money((float) $i['repasse_periodo'])) ?></td>
                <td><?= e((string) $i['criado_em']) ?></td>
              </tr>
            <?php endforeach; ?>
            <?php if (!$indicados): ?><tr><td colspan="7">Nenhum cadastro indicado.</td></tr><?php endif; ?>
          </tbody>
        </table>
      </div>
    </section>

    <section class="panel">
      <div class="panel-header">
        <h1>Corridas com indicação</h1>
        <p>Últimas corridas que geraram repasse para indicador de motorista ou passageiro.</p>
      </div>
      <div class="panel-body table-wrap">
        <table>
          <thead>
            <tr>
              <th>ID</th>
              <th>Passageiro</th>
              <th>Motorista</th>
              <th>Valor</th>
              <th>Indicador passageiro</th>
              <th>Indicador motorista</th>
              <th>Finalizada em</th>
            </tr>
          </thead>
          <tbody>
            <?php foreach ($corridas as $c): ?>
              <tr>
                <td>#<?= e((string) $c['id']) ?></td>
                <td><?= e((string) $c['passageiro_nome']) ?></td>
                <td><?= e((string) ($c['motorista_nome'] ?? '--')) ?></td>
                <td><?= e(admin_money((float) $c['valor'])) ?></td>
                <td><?= e((string) ($c['indicador_passageiro_nome'] ?? '--')) ?><br><small><?= e(admin_money((float) $c['repasse_passageiro'])) ?></small></td>
                <td><?= e((string) ($c['indicador_motorista_nome'] ?? '--')) ?><br><small><?= e(admin_money((float) $c['repasse_motorista'])) ?></small></td>
                <td><?= e((string) $c['finalizada_em']) ?></td>
              </tr>
            <?php endforeach; ?>
            <?php if (!$corridas): ?><tr><td colspan="7">Nenhuma corrida com indicação no período.</td></tr><?php endif; ?>
          </tbody>
        </table>
      </div>
    </section>
  </main>
  <script>
    (() => {
      const form = document.querySelector('.period-form');
      if (!form) return;

      const pills = [...form.querySelectorAll('.period-pill')];
      const fields = [...form.querySelectorAll('[data-period-field]')];

      function syncPeriodUi() {
        const checked = form.querySelector('input[name="periodo"]:checked');
        const value = checked ? checked.value : 'mes';
        pills.forEach((pill) => {
          const input = pill.querySelector('input[name="periodo"]');
          pill.classList.toggle('active', input ? input.checked : false);
        });
        fields.forEach((field) => {
          const visible = field.dataset.periodField === value;
          field.hidden = !visible;
          field.querySelectorAll('input, select, textarea').forEach((input) => {
            input.disabled = !visible;
          });
        });
      }

      form.querySelectorAll('input[name="periodo"]').forEach((input) => {
        input.addEventListener('change', syncPeriodUi);
      });
      syncPeriodUi();
    })();
  </script>
</body>
</html>
<?php
function admin_indicacoes_periodo_sql(?string $inicio, ?string $fim, string $alias = 'c'): array
{
    if ($inicio === null || $fim === null) {
        return ['', []];
    }

    return [
        ' AND COALESCE(' . $alias . '.finalizada_em, ' . $alias . '.criada_em) >= ? AND COALESCE(' . $alias . '.finalizada_em, ' . $alias . '.criada_em) < ?',
        [$inicio, $fim],
    ];
}

function admin_indicacoes_resumo(?string $inicio, ?string $fim): array
{
    [$periodoSql, $params] = admin_indicacoes_periodo_sql($inicio, $fim);

    $cadastros = db()->query(
        'SELECT
            COUNT(*) AS total_indicados,
            SUM(CASE WHEN u.tipo = "passageiro" THEN 1 ELSE 0 END) AS passageiros_indicados,
            SUM(CASE WHEN u.tipo = "motorista" THEN 1 ELSE 0 END) AS motoristas_indicados,
            COUNT(DISTINCT u.indicador_codigo) AS indicadores_ativos
         FROM usuarios u
         INNER JOIN usuarios ind ON ind.codigoind = u.indicador_codigo
         WHERE NULLIF(TRIM(COALESCE(u.indicador_codigo, "")), "") IS NOT NULL
           AND (u.tipo = "passageiro" OR (u.tipo = "motorista" AND ind.tipo = "motorista"))'
    )->fetch() ?: [];

    $codigos = db()->query('SELECT COUNT(*) FROM usuarios WHERE NULLIF(TRIM(COALESCE(codigoind, "")), "") IS NOT NULL')->fetchColumn();

    $stmt = db()->prepare(
        'SELECT
            COUNT(*) AS corridas,
            COALESCE(SUM(COALESCE(c.valor, 0)), 0) AS valor_total,
            COALESCE(SUM(CASE WHEN im.id IS NOT NULL THEN COALESCE(c.valor, 0) * 0.025 ELSE 0 END), 0) AS repasse_motoristas,
            COALESCE(SUM(CASE WHEN ip.id IS NOT NULL THEN COALESCE(c.valor, 0) * 0.015 ELSE 0 END), 0) AS repasse_passageiros,
            COALESCE(SUM(CASE WHEN im.id IS NULL THEN COALESCE(c.valor, 0) * 0.025 ELSE 0 END), 0) AS sobra_motoristas,
            COALESCE(SUM(CASE WHEN ip.id IS NULL THEN COALESCE(c.valor, 0) * 0.015 ELSE 0 END), 0) AS sobra_passageiros,
            SUM(CASE WHEN im.id IS NOT NULL THEN 1 ELSE 0 END) AS corridas_motorista_indicado,
            SUM(CASE WHEN ip.id IS NOT NULL THEN 1 ELSE 0 END) AS corridas_passageiro_indicado
         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 usuarios im ON im.codigoind = m.indicador_codigo AND im.tipo = "motorista"
         LEFT JOIN usuarios ip ON ip.codigoind = p.indicador_codigo
         WHERE c.status = "finalizada"' . $periodoSql
    );
    $stmt->execute($params);
    $valores = $stmt->fetch() ?: [];

    $repasseMotoristas = (float) ($valores['repasse_motoristas'] ?? 0);
    $repassePassageiros = (float) ($valores['repasse_passageiros'] ?? 0);
    $sobra = (float) ($valores['sobra_motoristas'] ?? 0) + (float) ($valores['sobra_passageiros'] ?? 0);

    return [
        'total_indicados' => (int) ($cadastros['total_indicados'] ?? 0),
        'passageiros_indicados' => (int) ($cadastros['passageiros_indicados'] ?? 0),
        'motoristas_indicados' => (int) ($cadastros['motoristas_indicados'] ?? 0),
        'indicadores_ativos' => (int) ($cadastros['indicadores_ativos'] ?? 0),
        'codigos_disponiveis' => (int) ($codigos ?: 0),
        'corridas' => (int) ($valores['corridas'] ?? 0),
        'valor_total' => round((float) ($valores['valor_total'] ?? 0), 2),
        'repasse_motoristas' => round($repasseMotoristas, 2),
        'repasse_passageiros' => round($repassePassageiros, 2),
        'repasses_total' => round($repasseMotoristas + $repassePassageiros, 2),
        'sobra_sem_indicacao' => round($sobra, 2),
        'corridas_motorista_indicado' => (int) ($valores['corridas_motorista_indicado'] ?? 0),
        'corridas_passageiro_indicado' => (int) ($valores['corridas_passageiro_indicado'] ?? 0),
    ];
}

function admin_indicacoes_ranking(?string $inicio, ?string $fim): array
{
    [$periodoSql, $params] = admin_indicacoes_periodo_sql($inicio, $fim);
    $sql = 'SELECT
              i.id, i.nome, i.tipo, i.codigoind,
              COALESCE(ref.total_indicados, 0) AS total_indicados,
              COALESCE(ref.passageiros_indicados, 0) AS passageiros_indicados,
              COALESCE(ref.motoristas_indicados, 0) AS motoristas_indicados,
              COALESCE(mv.corridas_motoristas, 0) AS corridas_motoristas,
              COALESCE(mv.valor_motoristas, 0) AS valor_motoristas,
              COALESCE(mv.repasse_motoristas, 0) AS repasse_motoristas,
              COALESCE(pv.corridas_passageiros, 0) AS corridas_passageiros,
              COALESCE(pv.valor_passageiros, 0) AS valor_passageiros,
              COALESCE(pv.repasse_passageiros, 0) AS repasse_passageiros
            FROM usuarios i
            LEFT JOIN (
              SELECT u.indicador_codigo,
                     COUNT(*) AS total_indicados,
                     SUM(CASE WHEN u.tipo = "passageiro" THEN 1 ELSE 0 END) AS passageiros_indicados,
                     SUM(CASE WHEN u.tipo = "motorista" THEN 1 ELSE 0 END) AS motoristas_indicados
              FROM usuarios u
              INNER JOIN usuarios ind ON ind.codigoind = u.indicador_codigo
              WHERE NULLIF(TRIM(COALESCE(u.indicador_codigo, "")), "") IS NOT NULL
                AND (u.tipo = "passageiro" OR (u.tipo = "motorista" AND ind.tipo = "motorista"))
              GROUP BY u.indicador_codigo
            ) ref ON ref.indicador_codigo = i.codigoind
            LEFT JOIN (
              SELECT m.indicador_codigo AS codigo,
                     COUNT(*) AS corridas_motoristas,
                     COALESCE(SUM(c.valor), 0) AS valor_motoristas,
                     COALESCE(SUM(c.valor * 0.025), 0) AS repasse_motoristas
              FROM corridas c
              INNER JOIN usuarios m ON m.id = c.id_motorista
              INNER JOIN usuarios im ON im.codigoind = m.indicador_codigo AND im.tipo = "motorista"
              WHERE c.status = "finalizada"
                AND NULLIF(TRIM(COALESCE(m.indicador_codigo, "")), "") IS NOT NULL' . $periodoSql . '
              GROUP BY m.indicador_codigo
            ) mv ON mv.codigo = i.codigoind
            LEFT JOIN (
              SELECT p.indicador_codigo AS codigo,
                     COUNT(*) AS corridas_passageiros,
                     COALESCE(SUM(c.valor), 0) AS valor_passageiros,
                     COALESCE(SUM(c.valor * 0.015), 0) AS repasse_passageiros
              FROM corridas c
              INNER JOIN usuarios p ON p.id = c.id_passageiro
              INNER JOIN usuarios ip ON ip.codigoind = p.indicador_codigo
              WHERE c.status = "finalizada"
                AND NULLIF(TRIM(COALESCE(p.indicador_codigo, "")), "") IS NOT NULL' . $periodoSql . '
              GROUP BY p.indicador_codigo
            ) pv ON pv.codigo = i.codigoind
            WHERE ref.total_indicados IS NOT NULL OR mv.corridas_motoristas IS NOT NULL OR pv.corridas_passageiros IS NOT NULL
            ORDER BY (COALESCE(mv.repasse_motoristas, 0) + COALESCE(pv.repasse_passageiros, 0)) DESC,
                     COALESCE(ref.total_indicados, 0) DESC,
                     i.nome ASC
            LIMIT 100';
    $stmt = db()->prepare($sql);
    $stmt->execute(array_merge($params, $params));

    return $stmt->fetchAll();
}

function admin_indicacoes_indicados(?string $inicio, ?string $fim): array
{
    [$periodoSql, $params] = admin_indicacoes_periodo_sql($inicio, $fim);
    $stmt = db()->prepare(
        'SELECT
            u.id, u.nome, u.email, u.tipo, u.codigoind, u.indicador_codigo, u.criado_em,
            ind.nome AS indicador_nome,
            ind.tipo AS indicador_tipo,
            COUNT(c.id) AS corridas_periodo,
            COALESCE(SUM(c.valor), 0) AS valor_periodo,
            COALESCE(SUM(CASE WHEN u.tipo = "motorista" THEN c.valor * 0.025 ELSE c.valor * 0.015 END), 0) AS repasse_periodo
         FROM usuarios u
         LEFT JOIN usuarios ind ON ind.codigoind = u.indicador_codigo
         LEFT JOIN corridas c ON (
            (u.tipo = "motorista" AND c.id_motorista = u.id)
            OR (u.tipo = "passageiro" AND c.id_passageiro = u.id)
         ) AND c.status = "finalizada"' . $periodoSql . '
         WHERE NULLIF(TRIM(COALESCE(u.indicador_codigo, "")), "") IS NOT NULL
           AND ind.id IS NOT NULL
           AND (u.tipo = "passageiro" OR (u.tipo = "motorista" AND ind.tipo = "motorista"))
         GROUP BY u.id, u.nome, u.email, u.tipo, u.codigoind, u.indicador_codigo, u.criado_em, ind.nome, ind.tipo
         ORDER BY repasse_periodo DESC, u.criado_em DESC
         LIMIT 200'
    );
    $stmt->execute($params);

    return $stmt->fetchAll();
}

function admin_indicacoes_corridas(?string $inicio, ?string $fim): array
{
    [$periodoSql, $params] = admin_indicacoes_periodo_sql($inicio, $fim);
    $stmt = db()->prepare(
        'SELECT
            c.id, c.valor, c.forma_pagamento, c.finalizada_em,
            p.nome AS passageiro_nome,
            m.nome AS motorista_nome,
            ip.nome AS indicador_passageiro_nome,
            im.nome AS indicador_motorista_nome,
            CASE WHEN ip.id IS NOT NULL THEN c.valor * 0.015 ELSE 0 END AS repasse_passageiro,
            CASE WHEN im.id IS NOT NULL THEN c.valor * 0.025 ELSE 0 END AS repasse_motorista
         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 usuarios ip ON ip.codigoind = p.indicador_codigo
         LEFT JOIN usuarios im ON im.codigoind = m.indicador_codigo AND im.tipo = "motorista"
         WHERE c.status = "finalizada"
           AND (ip.id IS NOT NULL OR im.id IS NOT NULL)' . $periodoSql . '
         ORDER BY c.finalizada_em DESC
         LIMIT 100'
    );
    $stmt->execute($params);

    return $stmt->fetchAll();
}

function admin_indicacoes_mensal(): array
{
    $stmt = db()->query(
        'SELECT
            DATE_FORMAT(COALESCE(c.finalizada_em, c.criada_em), "%Y-%m") AS mes,
            COUNT(*) AS corridas,
            COALESCE(SUM(CASE WHEN im.id IS NOT NULL THEN c.valor * 0.025 ELSE 0 END), 0)
              + COALESCE(SUM(CASE WHEN ip.id IS NOT NULL THEN c.valor * 0.015 ELSE 0 END), 0) AS repasses,
            COALESCE(SUM(CASE WHEN im.id IS NULL THEN c.valor * 0.025 ELSE 0 END), 0)
              + COALESCE(SUM(CASE WHEN ip.id IS NULL THEN c.valor * 0.015 ELSE 0 END), 0) AS sobra
         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 usuarios im ON im.codigoind = m.indicador_codigo AND im.tipo = "motorista"
         LEFT JOIN usuarios ip ON ip.codigoind = p.indicador_codigo
         WHERE c.status = "finalizada"
           AND COALESCE(c.finalizada_em, c.criada_em) >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
         GROUP BY mes
         ORDER BY mes DESC
         LIMIT 12'
    );

    return $stmt->fetchAll();
}

function admin_indicacoes_parse_data(string $valor, DateTimeImmutable $fallback): DateTimeImmutable
{
    $data = DateTimeImmutable::createFromFormat('!Y-m-d', $valor);
    if (!$data || $data->format('Y-m-d') !== $valor) {
        return $fallback;
    }

    return $data;
}

function admin_indicacoes_parse_semana(string $valor, DateTimeImmutable $fallback): DateTimeImmutable
{
    $fallback = $fallback->modify('-' . ((int) $fallback->format('N') - 1) . ' days');
    if (!preg_match('/^(\d{4})-W(\d{2})$/', $valor, $matches)) {
        return $fallback;
    }

    $data = $fallback->setISODate((int) $matches[1], (int) $matches[2], 1);
    if ($data->format('o-\WW') !== $valor) {
        return $fallback;
    }

    return $data;
}

function admin_indicacoes_parse_mes(string $valor, DateTimeImmutable $fallback): DateTimeImmutable
{
    $data = DateTimeImmutable::createFromFormat('!Y-m-d', $valor . '-01');
    if (!$data || $data->format('Y-m') !== $valor) {
        return $fallback->modify('first day of this month');
    }

    return $data;
}

function admin_indicacoes_parse_ano(string $valor, DateTimeImmutable $fallback): DateTimeImmutable
{
    $valor = trim($valor);
    if (!preg_match('/^\d{4}$/', $valor)) {
        return $fallback->modify('first day of january this year');
    }

    $data = DateTimeImmutable::createFromFormat('!Y-m-d', $valor . '-01-01');
    if (!$data || $data->format('Y') !== $valor) {
        return $fallback->modify('first day of january this year');
    }

    return $data;
}
