<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/admin.php';
require_once __DIR__ . '/../config/motorista_status_helpers.php';
require_once __DIR__ . '/../config/suporte_helpers.php';
require_once __DIR__ . '/../config/carteira_helpers.php';
require_once __DIR__ . '/../config/tarifas_helpers.php';
require_once __DIR__ . '/../config/motorista_metricas_corridas_helpers.php';

if (PHP_SAPI !== 'cli' && session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

function admin_is_logged(): bool
{
    return isset($_SESSION['admin_logged']) && $_SESSION['admin_logged'] === true;
}

function admin_current_user(): string
{
    return (string) ($_SESSION['admin_user'] ?? ADMIN_USER);
}

function admin_require_login(): void
{
    if (!admin_is_logged()) {
        header('Location: login.php');
        exit;
    }
}

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}

function admin_suporte_pendentes_count(): int
{
    try {
        $stmt = db()->query(
            'SELECT COUNT(DISTINCT sc.id)
             FROM suporte_chamados sc
             LEFT JOIN suporte_mensagens sm
               ON sm.id_chamado = sc.id
              AND sm.remetente_tipo IN ("motorista", "passageiro")
              AND sm.lido_admin = 0
             WHERE sc.status = "aberto"
                OR sm.id IS NOT NULL'
        );

        return (int) $stmt->fetchColumn();
    } catch (Throwable) {
        return 0;
    }
}

function admin_sidebar(string $active = 'dashboard'): void
{
    $suportePendentes = admin_suporte_pendentes_count();
    $links = [
        ['key' => 'dashboard', 'href' => 'index.php', 'label' => 'Dashboard'],
        ['key' => 'tempo_real', 'href' => 'tempo_real.php', 'label' => 'Tempo real'],
        ['key' => 'corridas', 'href' => 'corridas.php', 'label' => 'Corridas'],
        ['key' => 'suporte', 'href' => 'suporte.php', 'label' => 'Suporte', 'badge' => $suportePendentes],
        ['key' => 'avisos', 'href' => 'avisos.php', 'label' => 'Avisos'],
        [
            'key' => 'motoristas',
            'label' => 'Motoristas',
            'children' => [
                ['key' => 'motoristas', 'href' => 'cadastros_motoristas.php', 'label' => 'Cadastros'],
                ['key' => 'pendentes', 'href' => 'pendentes_documentos.php', 'label' => 'Pendentes'],
            ],
        ],
        [
            'key' => 'passageiros',
            'label' => 'Passageiros',
            'children' => [
                ['key' => 'passageiros', 'href' => 'passageiros.php', 'label' => 'Cadastros'],
                ['key' => 'passageiros_documentos', 'href' => 'passageiros_documentos.php', 'label' => 'Documentos'],
            ],
        ],
        ['key' => 'indicacoes', 'href' => 'indicacoes.php', 'label' => 'Indicações'],
        ['key' => 'retiradas_indicacoes', 'href' => 'retiradas_indicacoes.php', 'label' => 'Retiradas indic.'],
        ['key' => 'retiradas_carteira', 'href' => 'retiradas_carteira.php', 'label' => 'Resgates carteira'],
        ['key' => 'receitas', 'href' => 'receitas.php', 'label' => 'Receitas'],
        ['key' => 'pagamentos', 'href' => 'pagamentos.php', 'label' => 'Pagamentos'],
        [
            'key' => 'configuracoes',
            'label' => 'Configurações',
            'children' => [
                ['key' => 'configuracoes', 'href' => 'configuracoes.php', 'label' => 'Tarifas'],
                ['key' => 'configuracoes_veiculos', 'href' => 'configuracoes_veiculos.php', 'label' => 'Veículos'],
            ],
        ],
    ];
    ?>
    <header class="topbar">
      <div class="topbar-inner">
        <div class="brand">Bulo<br>Admin Panel</div>
        <nav class="sidebar-nav" aria-label="Menu administrativo">
          <?php foreach ($links as $link): ?>
            <?php if (isset($link['children'])): ?>
              <?php
                $children = $link['children'];
                $groupActive = $active === $link['key'];
                foreach ($children as $child) {
                    if ($active === $child['key']) {
                        $groupActive = true;
                    }
                }
              ?>
              <details class="nav-group <?= $groupActive ? 'active' : '' ?>" <?= $groupActive ? 'open' : '' ?>>
                <summary class="nav-parent" aria-current="<?= $groupActive ? 'page' : 'false' ?>">
                  <?= e($link['label']) ?>
                </summary>
                <div class="nav-submenu">
                  <?php foreach ($children as $child): ?>
                    <a class="nav-sublink <?= $active === $child['key'] ? 'active' : '' ?>" href="<?= e($child['href']) ?>">
                      <?= e($child['label']) ?>
                    </a>
                  <?php endforeach; ?>
                </div>
              </details>
            <?php else: ?>
              <a class="nav-link <?= $active === $link['key'] ? 'active' : '' ?>" href="<?= e($link['href']) ?>">
                <span class="nav-label"><?= e($link['label']) ?></span>
                <?php if (($link['badge'] ?? 0) > 0): ?>
                  <span class="nav-badge" title="<?= (int) $link['badge'] ?> aguardando atendimento">
                    <?= (int) $link['badge'] > 99 ? '99+' : (int) $link['badge'] ?>
                  </span>
                <?php endif; ?>
              </a>
            <?php endif; ?>
          <?php endforeach; ?>
          <a class="nav-link nav-logout" href="logout.php">Sair</a>
        </nav>
      </div>
    </header>
    <?php
}

function admin_flash(?string $message = null, string $type = 'success'): ?array
{
    if ($message !== null) {
        $_SESSION['flash'] = ['message' => $message, 'type' => $type];
        return null;
    }

    $flash = $_SESSION['flash'] ?? null;
    unset($_SESSION['flash']);
    return $flash;
}

function admin_get_configuracoes(): array
{
    $defaults = [
        'preco_base' => ['valor' => 5.00, 'descricao' => 'Econômica: valor inicial fixo da corrida'],
        'preco_por_km' => ['valor' => 2.50, 'descricao' => 'Econômica: valor cobrado por quilômetro'],
        'preco_por_minuto' => ['valor' => 0.35, 'descricao' => 'Econômica: valor cobrado por minuto estimado'],
        'taxa_servico' => ['valor' => 0.00, 'descricao' => 'Econômica: taxa fixa adicional da plataforma'],
        'valor_minimo' => ['valor' => 5.00, 'descricao' => 'Econômica: menor valor permitido para a corrida'],
        'plus_preco_base' => ['valor' => 5.00, 'descricao' => 'Plus: valor inicial fixo da corrida'],
        'plus_preco_por_km' => ['valor' => 2.50, 'descricao' => 'Plus: valor cobrado por quilômetro'],
        'plus_preco_por_minuto' => ['valor' => 0.35, 'descricao' => 'Plus: valor cobrado por minuto estimado'],
        'plus_taxa_servico' => ['valor' => 0.00, 'descricao' => 'Plus: taxa fixa adicional da plataforma'],
        'plus_valor_minimo' => ['valor' => 5.00, 'descricao' => 'Plus: menor valor permitido para a corrida'],
        'pro_preco_base' => ['valor' => 5.00, 'descricao' => 'Pro: valor inicial fixo da corrida'],
        'pro_preco_por_km' => ['valor' => 2.50, 'descricao' => 'Pro: valor cobrado por quilômetro'],
        'pro_preco_por_minuto' => ['valor' => 0.35, 'descricao' => 'Pro: valor cobrado por minuto estimado'],
        'pro_taxa_servico' => ['valor' => 0.00, 'descricao' => 'Pro: taxa fixa adicional da plataforma'],
        'pro_valor_minimo' => ['valor' => 5.00, 'descricao' => 'Pro: menor valor permitido para a corrida'],
    ];

    $stmt = db()->query('SELECT chave, valor, descricao, atualizado_por, atualizado_em FROM configuracoes');
    foreach ($stmt->fetchAll() as $row) {
        $chave = $row['chave'];
        $defaults[$chave] = [
            'valor' => (float) $row['valor'],
            'descricao' => $row['descricao'] ?: ($defaults[$chave]['descricao'] ?? ''),
            'atualizado_por' => $row['atualizado_por'] ?? null,
            'atualizado_em' => $row['atualizado_em'] ?? null,
        ];
    }

    return $defaults;
}

function admin_get_tarifa_regioes(): array
{
    try {
        $pdo = db();
        if (!tarifas_table_exists($pdo, 'tarifa_regioes')) {
            return [];
        }

        $stmt = $pdo->query(
            'SELECT *
             FROM tarifa_regioes
             ORDER BY ordem ASC, id ASC'
        );

        return array_map(static function (array $row): array {
            return [
                'id' => (int) $row['id'],
                'nome' => (string) $row['nome'],
                'ativo' => (int) $row['ativo'] === 1,
                'ordem' => (int) $row['ordem'],
                'geocerca' => tarifas_decode_geocerca($row['geocerca_json'] ?? null),
                'geocerca_json' => (string) ($row['geocerca_json'] ?? ''),
                'centro_lat' => $row['centro_lat'] === null ? null : (float) $row['centro_lat'],
                'centro_lng' => $row['centro_lng'] === null ? null : (float) $row['centro_lng'],
                'preco_base' => (float) $row['preco_base'],
                'preco_por_km' => (float) $row['preco_por_km'],
                'preco_por_minuto' => (float) $row['preco_por_minuto'],
                'taxa_servico' => (float) $row['taxa_servico'],
                'valor_minimo' => isset($row['valor_minimo']) ? (float) $row['valor_minimo'] : (float) $row['preco_base'],
                'plus_preco_base' => isset($row['plus_preco_base']) ? (float) $row['plus_preco_base'] : (float) $row['preco_base'],
                'plus_preco_por_km' => isset($row['plus_preco_por_km']) ? (float) $row['plus_preco_por_km'] : (float) $row['preco_por_km'],
                'plus_preco_por_minuto' => isset($row['plus_preco_por_minuto']) ? (float) $row['plus_preco_por_minuto'] : (float) $row['preco_por_minuto'],
                'plus_taxa_servico' => isset($row['plus_taxa_servico']) ? (float) $row['plus_taxa_servico'] : (float) $row['taxa_servico'],
                'plus_valor_minimo' => isset($row['plus_valor_minimo']) ? (float) $row['plus_valor_minimo'] : (float) ($row['valor_minimo'] ?? $row['preco_base']),
                'pro_preco_base' => isset($row['pro_preco_base']) ? (float) $row['pro_preco_base'] : (float) $row['preco_base'],
                'pro_preco_por_km' => isset($row['pro_preco_por_km']) ? (float) $row['pro_preco_por_km'] : (float) $row['preco_por_km'],
                'pro_preco_por_minuto' => isset($row['pro_preco_por_minuto']) ? (float) $row['pro_preco_por_minuto'] : (float) $row['preco_por_minuto'],
                'pro_taxa_servico' => isset($row['pro_taxa_servico']) ? (float) $row['pro_taxa_servico'] : (float) $row['taxa_servico'],
                'pro_valor_minimo' => isset($row['pro_valor_minimo']) ? (float) $row['pro_valor_minimo'] : (float) ($row['valor_minimo'] ?? $row['preco_base']),
                'economica_ativo' => (int) $row['economica_ativo'] === 1,
                'plus_ativo' => (int) $row['plus_ativo'] === 1,
                'pro_ativo' => (int) $row['pro_ativo'] === 1,
                'dinamica_ativa' => (int) ($row['dinamica_ativa'] ?? 0) === 1,
                'dinamica_multiplicador_max' => isset($row['dinamica_multiplicador_max']) ? (float) $row['dinamica_multiplicador_max'] : 1.80,
                'dinamica_sensibilidade' => (string) ($row['dinamica_sensibilidade'] ?? 'media'),
                'dinamica_celula_km' => isset($row['dinamica_celula_km']) ? (float) $row['dinamica_celula_km'] : 2.00,
                'dinamica_janela_minutos' => isset($row['dinamica_janela_minutos']) ? (int) $row['dinamica_janela_minutos'] : 12,
                'criado_por' => $row['criado_por'] ?? null,
                'atualizado_por' => $row['atualizado_por'] ?? null,
                'atualizado_em' => $row['atualizado_em'] ?? null,
            ];
        }, $stmt->fetchAll());
    } catch (Throwable) {
        return [];
    }
}

function label_configuracao(string $chave): string
{
    $labels = [
        'preco_base' => 'Preco base',
        'preco_por_km' => 'Preco por km',
        'preco_por_minuto' => 'Preco por minuto',
        'taxa_servico' => 'Taxa de servico',
        'valor_minimo' => 'Valor mínimo',
        'plus_preco_base' => 'Plus - preco base',
        'plus_preco_por_km' => 'Plus - preco por km',
        'plus_preco_por_minuto' => 'Plus - preco por minuto',
        'plus_taxa_servico' => 'Plus - taxa de servico',
        'plus_valor_minimo' => 'Plus - valor mínimo',
        'pro_preco_base' => 'Pro - preco base',
        'pro_preco_por_km' => 'Pro - preco por km',
        'pro_preco_por_minuto' => 'Pro - preco por minuto',
        'pro_taxa_servico' => 'Pro - taxa de servico',
        'pro_valor_minimo' => 'Pro - valor mínimo',
    ];

    return $labels[$chave] ?? ucfirst(str_replace('_', ' ', $chave));
}

function admin_column_exists(string $table, string $column): bool
{
    $stmt = db()->prepare(
        'SELECT COUNT(*)
         FROM INFORMATION_SCHEMA.COLUMNS
         WHERE TABLE_SCHEMA = DATABASE()
           AND TABLE_NAME = ?
           AND COLUMN_NAME = ?'
    );
    $stmt->execute([$table, $column]);

    return (int) $stmt->fetchColumn() > 0;
}

function admin_table_exists(string $table): bool
{
    $stmt = db()->prepare(
        'SELECT COUNT(*)
         FROM INFORMATION_SCHEMA.TABLES
         WHERE TABLE_SCHEMA = DATABASE()
           AND TABLE_NAME = ?'
    );
    $stmt->execute([$table]);

    return (int) $stmt->fetchColumn() > 0;
}

function admin_dashboard_resumo(): array
{
    $pdo = db();

    $usuarios = $pdo->query(
        'SELECT tipo, COUNT(*) AS total
         FROM usuarios
         GROUP BY tipo'
    )->fetchAll();

    $totaisUsuarios = ['passageiro' => 0, 'motorista' => 0];
    foreach ($usuarios as $row) {
        $totaisUsuarios[(string) $row['tipo']] = (int) $row['total'];
    }

    $corridas = $pdo->query(
        'SELECT COUNT(*) AS total_corridas,
                COALESCE(SUM(CASE WHEN status = "finalizada" THEN valor ELSE 0 END), 0) AS receita
         FROM corridas'
    )->fetch() ?: ['total_corridas' => 0, 'receita' => 0];

    $motoristasStatus = $pdo->query(
        'SELECT
            SUM(CASE WHEN disponivel = "sim" THEN 1 ELSE 0 END) AS online,
            SUM(CASE WHEN status_verificacao = "reprovado" THEN 1 ELSE 0 END) AS bloqueados
         FROM usuarios
         WHERE tipo = "motorista"'
    )->fetch() ?: ['online' => 0, 'bloqueados' => 0];

    return [
        'passageiros' => $totaisUsuarios['passageiro'],
        'motoristas' => $totaisUsuarios['motorista'],
        'corridas' => (int) $corridas['total_corridas'],
        'receita' => (float) $corridas['receita'],
        'motoristas_online' => (int) ($motoristasStatus['online'] ?? 0),
        'motoristas_bloqueados' => (int) ($motoristasStatus['bloqueados'] ?? 0),
    ];
}

function admin_dashboard_corridas_mes(): array
{
    $stmt = db()->query(
        'SELECT DATE_FORMAT(criada_em, "%Y-%m") AS mes, COUNT(*) AS total
         FROM corridas
         WHERE criada_em >= DATE_SUB(CURDATE(), INTERVAL 8 MONTH)
         GROUP BY mes
         ORDER BY mes ASC'
    );

    return $stmt->fetchAll();
}

function admin_dashboard_corridas_recentes(): array
{
    $stmt = db()->query(
        'SELECT c.id, c.status, c.valor, c.criada_em, c.origem_lat, c.origem_lng, c.destino_lat, c.destino_lng,
                p.nome AS passageiro_nome,
                COALESCE(m.primeiro_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.criada_em DESC
         LIMIT 8'
    );

    return $stmt->fetchAll();
}

function admin_receitas_resumo(?string $inicio = null, ?string $fim = null): array
{
    $temFormaPagamento = admin_column_exists('corridas', 'forma_pagamento');
    $dinheiroValor = $temFormaPagamento
        ? 'SUM(CASE WHEN c.forma_pagamento = "dinheiro" THEN COALESCE(c.valor, 0) ELSE 0 END)'
        : 'SUM(COALESCE(c.valor, 0))';
    $onlineValor = $temFormaPagamento
        ? 'SUM(CASE WHEN c.forma_pagamento = "online" THEN COALESCE(c.valor, 0) ELSE 0 END)'
        : '0';
    $dinheiroQtd = $temFormaPagamento
        ? 'SUM(CASE WHEN c.forma_pagamento = "dinheiro" THEN 1 ELSE 0 END)'
        : 'COUNT(*)';
    $onlineQtd = $temFormaPagamento
        ? 'SUM(CASE WHEN c.forma_pagamento = "online" THEN 1 ELSE 0 END)'
        : '0';
    $params = [];
    $periodoSql = '';
    if ($inicio !== null && $fim !== null) {
        $periodoSql = ' AND COALESCE(c.finalizada_em, c.criada_em) >= ? AND COALESCE(c.finalizada_em, c.criada_em) < ?';
        $params = [$inicio, $fim];
    }

    $stmt = db()->prepare(
        'SELECT
            COUNT(*) AS total_corridas,
            COALESCE(SUM(COALESCE(c.valor, 0)), 0) AS receita_total,
            COALESCE(' . $dinheiroValor . ', 0) AS receita_dinheiro,
            COALESCE(' . $onlineValor . ', 0) AS receita_online,
            COALESCE(' . $dinheiroQtd . ', 0) AS corridas_dinheiro,
            COALESCE(' . $onlineQtd . ', 0) AS corridas_online,
            COALESCE(SUM(CASE
              WHEN im.id IS NOT NULL
              THEN COALESCE(c.valor, 0) * 0.025
              ELSE 0
            END), 0) AS repasse_indicador_motorista,
            COALESCE(SUM(CASE
              WHEN ip.id IS NOT NULL
              THEN COALESCE(c.valor, 0) * 0.015
              ELSE 0
            END), 0) AS repasse_indicador_passageiro,
            COALESCE(SUM(CASE
              WHEN im.id IS NULL
              THEN COALESCE(c.valor, 0) * 0.025
              ELSE 0
            END), 0) AS sobra_indicador_motorista,
            COALESCE(SUM(CASE
              WHEN ip.id IS NULL
              THEN COALESCE(c.valor, 0) * 0.015
              ELSE 0
            END), 0) AS sobra_indicador_passageiro
         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);
    $row = $stmt->fetch() ?: [];

    $receitaTotal = (float) ($row['receita_total'] ?? 0);
    $repasseMotorista = (float) ($row['repasse_indicador_motorista'] ?? 0);
    $repassePassageiro = (float) ($row['repasse_indicador_passageiro'] ?? 0);
    $sobraMotorista = (float) ($row['sobra_indicador_motorista'] ?? 0);
    $sobraPassageiro = (float) ($row['sobra_indicador_passageiro'] ?? 0);
    $receitaDinheiro = (float) ($row['receita_dinheiro'] ?? 0);

    return [
        'total_corridas' => (int) ($row['total_corridas'] ?? 0),
        'receita_total' => round($receitaTotal, 2),
        'receita_plataforma' => round($receitaTotal * 0.11, 2),
        'receita_repassada_indicadores' => round($repasseMotorista + $repassePassageiro, 2),
        'repasse_indicador_motorista' => round($repasseMotorista, 2),
        'repasse_indicador_passageiro' => round($repassePassageiro, 2),
        'receita_sobra' => round($sobraMotorista + $sobraPassageiro, 2),
        'sobra_indicador_motorista' => round($sobraMotorista, 2),
        'sobra_indicador_passageiro' => round($sobraPassageiro, 2),
        'saldo_motoristas' => round($receitaDinheiro * 0.15, 2),
        'desconto_total' => round($receitaTotal * 0.15, 2),
        'liquido_motoristas' => round($receitaTotal - ($receitaTotal * 0.15), 2),
        'receita_dinheiro' => round($receitaDinheiro, 2),
        'receita_online' => round((float) ($row['receita_online'] ?? 0), 2),
        'corridas_dinheiro' => (int) ($row['corridas_dinheiro'] ?? 0),
        'corridas_online' => (int) ($row['corridas_online'] ?? 0),
    ];
}

function admin_money(float $valor): string
{
    return 'R$ ' . number_format($valor, 2, ',', '.');
}

function admin_buscar_motoristas(string $q = '', bool $somentePendentes = false): array
{
    $sql = 'SELECT u.id, u.nome, u.primeiro_nome, u.sobrenome, u.email, u.celular, u.cpf, u.codigoind, u.indicador_codigo, u.cep, u.endereco_logradouro, u.endereco_numero, u.endereco_complemento, u.endereco_bairro, u.endereco_cidade, u.endereco_uf, u.foto_url, u.cnh_status, u.cnh_observacao, u.cnh_vencimento, u.cnh_aprovado_por, u.cnh_aprovado_em, u.documento_veiculo_status, u.documento_veiculo_observacao, u.documento_veiculo_vencimento, u.documento_veiculo_aprovado_por, u.documento_veiculo_aprovado_em, u.selfie_status, u.selfie_observacao, u.selfie_aprovado_por, u.selfie_aprovado_em, u.status_verificacao, u.observacao_verificacao, u.disponivel, u.id_veiculo_ativo, u.criado_em, u.atualizado_em, u.cnh_url, u.documento_veiculo_url, u.selfie_url,
                   COALESCE(v.total_veiculos, 0) AS total_veiculos,
                   COALESCE(v.veiculos_aprovados, 0) AS veiculos_aprovados,
                   COALESCE(v.veiculos_reprovados, 0) AS veiculos_reprovados
            FROM usuarios u
            LEFT JOIN (
              SELECT id_motorista,
                     COUNT(*) AS total_veiculos,
                     SUM(CASE WHEN status = "aprovado" THEN 1 ELSE 0 END) AS veiculos_aprovados,
                     SUM(CASE WHEN status = "reprovado" THEN 1 ELSE 0 END) AS veiculos_reprovados
              FROM veiculos
              GROUP BY id_motorista
            ) v ON v.id_motorista = u.id
            WHERE u.tipo = "motorista"';
    $params = [];

    if ($q !== '') {
        $sql .= ' AND (nome LIKE ? OR email LIKE ? OR cpf LIKE ? OR celular LIKE ? OR endereco_cidade LIKE ? OR endereco_uf LIKE ?)';
        $like = '%' . $q . '%';
        $params = [$like, $like, $like, $like, $like, $like];
    }

    $sql .= ' ORDER BY criado_em DESC LIMIT 300';
    $stmt = db()->prepare($sql);
    $stmt->execute($params);
    $rows = $stmt->fetchAll();

    $out = [];
    foreach ($rows as $row) {
        $row['documento_veiculo_status_real'] = motorista_status_documento_real($row);
        $row['status_verificacao_operacional'] = motorista_status_operacional($row, (int) ($row['veiculos_aprovados'] ?? 0) > 0);
        if ($somentePendentes) {
            $temPendente = $row['cnh_status'] === 'pendente'
                || $row['selfie_status'] === 'pendente'
                || ($row['documento_veiculo_status_real'] ?? $row['documento_veiculo_status']) === 'pendente'
                || ($row['status_verificacao_operacional'] ?? $row['status_verificacao']) === 'pendente';
            if (!$temPendente) {
                continue;
            }
        }
        $out[] = $row;
    }

    return $out;
}

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

    $stmt = db()->prepare(
        'SELECT u.id, u.nome, u.primeiro_nome, u.sobrenome, u.email, u.celular, u.cpf, u.codigoind, u.indicador_codigo, u.cep, u.endereco_logradouro, u.endereco_numero, u.endereco_complemento, u.endereco_bairro, u.endereco_cidade, u.endereco_uf, u.foto_url, u.cnh_status, u.cnh_observacao, u.cnh_vencimento, u.cnh_aprovado_por, u.cnh_aprovado_em, u.documento_veiculo_status, u.documento_veiculo_observacao, u.documento_veiculo_vencimento, u.documento_veiculo_aprovado_por, u.documento_veiculo_aprovado_em, u.selfie_status, u.selfie_observacao, u.selfie_aprovado_por, u.selfie_aprovado_em, u.status_verificacao, u.observacao_verificacao, u.disponivel, u.id_veiculo_ativo, u.criado_em, u.atualizado_em, u.cnh_url, u.documento_veiculo_url, u.selfie_url,
                COALESCE(v.total_veiculos, 0) AS total_veiculos,
                COALESCE(v.veiculos_aprovados, 0) AS veiculos_aprovados,
                COALESCE(v.veiculos_reprovados, 0) AS veiculos_reprovados
         FROM usuarios u
         LEFT JOIN (
           SELECT id_motorista,
                  COUNT(*) AS total_veiculos,
                  SUM(CASE WHEN status = "aprovado" THEN 1 ELSE 0 END) AS veiculos_aprovados,
                  SUM(CASE WHEN status = "reprovado" THEN 1 ELSE 0 END) AS veiculos_reprovados
           FROM veiculos
           GROUP BY id_motorista
         ) v ON v.id_motorista = u.id
         WHERE u.id = ? AND u.tipo = "motorista"
         LIMIT 1'
    );
    $stmt->execute([$id]);
    $row = $stmt->fetch();
    if ($row) {
        $row['documento_veiculo_status_real'] = motorista_status_documento_real($row);
        $row['status_verificacao_operacional'] = motorista_status_operacional($row, (int) ($row['veiculos_aprovados'] ?? 0) > 0);
    }

    return $row ?: null;
}

function admin_resumo_motoristas_por_cidade(): array
{
    $stmt = db()->query(
        'SELECT COALESCE(NULLIF(endereco_cidade, ""), "Sem cidade") AS cidade,
                COALESCE(NULLIF(endereco_uf, ""), "--") AS uf,
                COUNT(*) AS total
         FROM usuarios
         WHERE tipo = "motorista"
         GROUP BY cidade, uf
         ORDER BY total DESC, cidade ASC
         LIMIT 12'
    );

    return $stmt->fetchAll();
}

function admin_buscar_veiculos(string $q = '', bool $somentePendentes = false): array
{
    $sql = 'SELECT v.id, v.id_motorista, v.marca, v.modelo, v.ano_fabricacao, v.ano_modelo, v.cor, v.placa, v.documento_url, v.status, v.observacao_revisao, v.documento_vencimento, v.aprovado_por, v.aprovado_em, v.criado_em, u.nome AS motorista_nome, u.email AS motorista_email
            FROM veiculos v
            INNER JOIN usuarios u ON u.id = v.id_motorista
            WHERE u.tipo = "motorista"';
    $params = [];

    if ($somentePendentes) {
        $sql .= ' AND v.status = "pendente"';
    }

    if ($q !== '') {
        $sql .= ' AND (u.nome LIKE ? OR u.email LIKE ? OR v.marca LIKE ? OR v.modelo LIKE ? OR v.placa LIKE ?)';
        $like = '%' . $q . '%';
        $params = [$like, $like, $like, $like, $like];
    }

    $sql .= ' ORDER BY v.criado_em DESC LIMIT 300';
    $stmt = db()->prepare($sql);
    $stmt->execute($params);
    return $stmt->fetchAll();
}

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

    $stmt = db()->prepare(
        'SELECT v.id, v.id_motorista, v.marca, v.modelo, v.ano_fabricacao, v.ano_modelo, v.cor, v.placa, v.documento_url, v.status, v.observacao_revisao, v.documento_vencimento, v.aprovado_por, v.aprovado_em, v.criado_em, v.atualizado_em, u.nome AS motorista_nome, u.email AS motorista_email
         FROM veiculos v
         INNER JOIN usuarios u ON u.id = v.id_motorista
         WHERE v.id = ? AND u.tipo = "motorista"
         LIMIT 1'
    );
    $stmt->execute([$id]);
    $row = $stmt->fetch();
    return $row ?: null;
}

function admin_buscar_usuarios_por_tipo(string $tipo, string $q = ''): array
{
    $sql = 'SELECT id, nome, primeiro_nome, sobrenome, email, celular, cpf, codigoind, indicador_codigo,
                   cep, endereco_logradouro, endereco_numero, endereco_complemento, endereco_bairro,
                   endereco_cidade, endereco_uf, foto_url, passageiro_documento_url,
                   passageiro_documento_selfie_url, passageiro_documento_status,
                   passageiro_documento_observacao, passageiro_documento_aprovado_por,
                   passageiro_documento_aprovado_em, status_verificacao, disponivel, criado_em, atualizado_em
            FROM usuarios
            WHERE tipo = ?';
    $params = [$tipo];

    if ($q !== '') {
        $sql .= ' AND (nome LIKE ? OR email LIKE ? OR cpf LIKE ? OR celular LIKE ? OR endereco_cidade LIKE ? OR endereco_uf LIKE ?)';
        $like = '%' . $q . '%';
        array_push($params, $like, $like, $like, $like, $like, $like);
    }

    $sql .= ' ORDER BY criado_em DESC LIMIT 300';
    $stmt = db()->prepare($sql);
    $stmt->execute($params);

    return $stmt->fetchAll();
}

function admin_buscar_usuario_por_id_tipo(int $id, string $tipo): ?array
{
    if ($id <= 0) {
        return null;
    }

    $stmt = db()->prepare(
        'SELECT id, nome, primeiro_nome, sobrenome, email, celular, cpf, tipo, codigoind, indicador_codigo,
                cep, endereco_logradouro, endereco_numero, endereco_complemento, endereco_bairro,
                endereco_cidade, endereco_uf, foto_url, passageiro_documento_url,
                passageiro_documento_selfie_url, passageiro_documento_status,
                passageiro_documento_observacao, passageiro_documento_aprovado_por,
                passageiro_documento_aprovado_em, status_verificacao, observacao_verificacao,
                disponivel, id_veiculo_ativo, criado_em, atualizado_em
         FROM usuarios
         WHERE id = ? AND tipo = ?
         LIMIT 1'
    );
    $stmt->execute([$id, $tipo]);
    $row = $stmt->fetch();

    return $row ?: null;
}

function admin_usuario_resumo_corridas(int $idUsuario, string $tipo): array
{
    $campo = $tipo === 'motorista' ? 'id_motorista' : 'id_passageiro';
    $stmt = db()->prepare(
        "SELECT
            COUNT(*) AS total_corridas,
            SUM(CASE WHEN status = 'finalizada' THEN 1 ELSE 0 END) AS finalizadas,
            SUM(CASE WHEN status = 'cancelada' THEN 1 ELSE 0 END) AS canceladas,
            SUM(CASE WHEN status IN ('pendente', 'aceita', 'em_andamento') THEN 1 ELSE 0 END) AS abertas,
            COALESCE(SUM(CASE WHEN status = 'finalizada' THEN valor ELSE 0 END), 0) AS valor_total,
            COALESCE(SUM(CASE WHEN status = 'finalizada' AND forma_pagamento = 'dinheiro' THEN valor ELSE 0 END), 0) AS valor_dinheiro,
            COALESCE(SUM(CASE WHEN status = 'finalizada' AND forma_pagamento = 'online' THEN valor ELSE 0 END), 0) AS valor_online,
            AVG(CASE WHEN avaliacao_motorista IS NOT NULL THEN avaliacao_motorista ELSE NULL END) AS avaliacao_media,
            SUM(CASE WHEN avaliacao_motorista IS NOT NULL THEN 1 ELSE 0 END) AS total_avaliacoes
         FROM corridas
         WHERE {$campo} = ?"
    );
    $stmt->execute([$idUsuario]);
    $row = $stmt->fetch() ?: [];
    $valorDinheiro = (float) ($row['valor_dinheiro'] ?? 0);

    return [
        'total_corridas' => (int) ($row['total_corridas'] ?? 0),
        'finalizadas' => (int) ($row['finalizadas'] ?? 0),
        'canceladas' => (int) ($row['canceladas'] ?? 0),
        'abertas' => (int) ($row['abertas'] ?? 0),
        'valor_total' => round((float) ($row['valor_total'] ?? 0), 2),
        'valor_dinheiro' => round($valorDinheiro, 2),
        'valor_online' => round((float) ($row['valor_online'] ?? 0), 2),
        'saldo_motorista' => round($valorDinheiro * 0.15, 2),
        'avaliacao_media' => $row['avaliacao_media'] === null ? null : round((float) $row['avaliacao_media'], 2),
        'total_avaliacoes' => (int) ($row['total_avaliacoes'] ?? 0),
    ];
}

function admin_motorista_metricas_corridas(int $idMotorista): array
{
    try {
        return motorista_metricas_corridas_recalcular(db(), $idMotorista);
    } catch (Throwable) {
        return motorista_metricas_corridas_vazio($idMotorista);
    }
}

function admin_usuario_corridas(int $idUsuario, string $tipo, int $limit = 80): array
{
    $campo = $tipo === 'motorista' ? 'c.id_motorista' : 'c.id_passageiro';
    $stmt = db()->prepare(
        "SELECT c.id, c.id_passageiro, c.id_motorista, c.status, c.valor, c.forma_pagamento, c.distancia,
                c.tempo_estimado, c.avaliacao_motorista, c.criada_em, c.aceita_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
         WHERE {$campo} = ?
         ORDER BY COALESCE(c.finalizada_em, c.criada_em) DESC
         LIMIT {$limit}"
    );
    $stmt->execute([$idUsuario]);

    return $stmt->fetchAll();
}

function admin_usuario_ganhos_diarios(int $idMotorista, int $limit = 30): array
{
    $stmt = db()->prepare(
        "SELECT data_ref, total_corridas, total_valor, atualizado_em
         FROM ganhos_diarios
         WHERE id_motorista = ?
         ORDER BY data_ref DESC
         LIMIT {$limit}"
    );
    $stmt->execute([$idMotorista]);

    return $stmt->fetchAll();
}

function admin_usuario_sessoes_online(int $idMotorista, int $limit = 30): array
{
    $stmt = db()->prepare(
        "SELECT inicio_em, fim_em, duracao_segundos
         FROM motorista_sessoes_online
         WHERE id_motorista = ?
         ORDER BY inicio_em DESC
         LIMIT {$limit}"
    );
    $stmt->execute([$idMotorista]);

    return $stmt->fetchAll();
}

function admin_usuario_veiculos(int $idMotorista): array
{
    $stmt = db()->prepare(
        'SELECT id, marca, modelo, ano_fabricacao, ano_modelo, cor, placa, documento_url, status,
                observacao_revisao, documento_vencimento, aprovado_por, aprovado_em, criado_em, atualizado_em
         FROM veiculos
         WHERE id_motorista = ?
         ORDER BY criado_em DESC'
    );
    $stmt->execute([$idMotorista]);

    return $stmt->fetchAll();
}

function admin_usuario_feedbacks(int $idUsuario, int $limit = 80): array
{
    if (!admin_table_exists('usuario_feedbacks')) {
        return [];
    }

    $stmt = db()->prepare(
        "SELECT id, tipo, origem, nota, comentario, id_corrida, registrado_por, criado_em
         FROM usuario_feedbacks
         WHERE id_usuario = ?
         ORDER BY criado_em DESC
         LIMIT {$limit}"
    );
    $stmt->execute([$idUsuario]);

    return $stmt->fetchAll();
}

function admin_usuario_feedback_resumo(int $idUsuario): array
{
    if (!admin_table_exists('usuario_feedbacks')) {
        return ['elogios' => 0, 'reclamacoes' => 0, 'observacoes' => 0];
    }

    $stmt = db()->prepare(
        'SELECT
            SUM(CASE WHEN tipo = "elogio" THEN 1 ELSE 0 END) AS elogios,
            SUM(CASE WHEN tipo = "reclamacao" THEN 1 ELSE 0 END) AS reclamacoes,
            SUM(CASE WHEN tipo = "observacao" THEN 1 ELSE 0 END) AS observacoes
         FROM usuario_feedbacks
         WHERE id_usuario = ?'
    );
    $stmt->execute([$idUsuario]);
    $row = $stmt->fetch() ?: [];

    return [
        'elogios' => (int) ($row['elogios'] ?? 0),
        'reclamacoes' => (int) ($row['reclamacoes'] ?? 0),
        'observacoes' => (int) ($row['observacoes'] ?? 0),
    ];
}

function admin_horas($segundos): string
{
    $segundos = max(0, (int) $segundos);
    $horas = intdiv($segundos, 3600);
    $minutos = intdiv($segundos % 3600, 60);

    return sprintf('%dh%02d', $horas, $minutos);
}

function admin_status_class(string $status): string
{
    switch ($status) {
        case 'aprovado':
            return 'badge-ok';
        case 'reprovado':
            return 'badge-bad';
        default:
            return 'badge-warn';
    }
}

function admin_disponibilidade_class(string $disponivel): string
{
    return $disponivel === 'sim' ? 'badge-ok' : 'badge-muted';
}

function admin_documento_label(string $chave): string
{
    $labels = [
        'cnh_status' => 'CNH',
        'documento_veiculo_status' => 'Veículo',
        'selfie_status' => 'Foto',
    ];

    return $labels[$chave] ?? ucfirst(str_replace('_status', '', str_replace('_', ' ', $chave)));
}

function admin_veiculo_status_class(string $status): string
{
    return admin_status_class($status);
}
