<?php
declare(strict_types=1);

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

$pdo = db();
$categorias = suporte_categorias();
$prioridades = suporte_prioridades();
$statuses = suporte_statuses();

if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
    $idChamado = (int) ($_POST['id_chamado'] ?? 0);
    $acao = (string) ($_POST['acao'] ?? 'salvar');
    $resposta = trim((string) ($_POST['resposta'] ?? ''));
    $admin = admin_current_user();

    if ($idChamado <= 0) {
        admin_flash('Chamado inválido.', 'error');
        header('Location: suporte.php');
        exit;
    }

    try {
        $atualStmt = $pdo->prepare('SELECT status, prioridade FROM suporte_chamados WHERE id = ? LIMIT 1');
        $atualStmt->execute([$idChamado]);
        $atual = $atualStmt->fetch();
        if (!$atual) {
            throw new RuntimeException('Chamado não encontrado.');
        }

        $statusAtual = (string) $atual['status'];
        $prioridadeAtual = (string) $atual['prioridade'];
        $prioridade = isset($_POST['prioridade'])
            ? suporte_normalizar_opcao((string) $_POST['prioridade'], $prioridades, $prioridadeAtual)
            : $prioridadeAtual;
        $statusFormulario = isset($_POST['status'])
            ? suporte_normalizar_opcao((string) $_POST['status'], $statuses, $statusAtual)
            : $statusAtual;

        $status = match ($acao) {
            'assumir', 'em_atendimento' => 'em_atendimento',
            'aguardar_motorista' => 'aguardando_motorista',
            'finalizar' => 'resolvido',
            default => $statusFormulario,
        };

        $mensagemAcao = match ($acao) {
            'assumir' => 'Atendimento assumido por ' . $admin . '.',
            'em_atendimento' => 'Chamado movido para em atendimento por ' . $admin . '.',
            'aguardar_motorista' => 'Chamado marcado como aguardando resposta do motorista por ' . $admin . '.',
            'finalizar' => 'Atendimento finalizado por ' . $admin . '.',
            default => '',
        };

        $pdo->beginTransaction();
        $up = $pdo->prepare(
            'UPDATE suporte_chamados
             SET status = ?, prioridade = ?, admin_responsavel = ?
             WHERE id = ?'
        );
        $up->execute([$status, $prioridade, $admin, $idChamado]);

        if ($mensagemAcao !== '') {
            $hist = $pdo->prepare(
                'INSERT INTO suporte_mensagens
                 (id_chamado, remetente_tipo, nome_remetente, mensagem, lido_motorista, lido_admin)
                 VALUES (?, "sistema", "Sistema", ?, 0, 1)'
            );
            $hist->execute([$idChamado, $mensagemAcao]);
        }

        if ($resposta !== '') {
            $msg = $pdo->prepare(
                'INSERT INTO suporte_mensagens
                 (id_chamado, remetente_tipo, nome_remetente, mensagem, lido_motorista, lido_admin)
                 VALUES (?, "admin", ?, ?, 0, 1)'
            );
            $msg->execute([$idChamado, $admin, $resposta]);
        }

        if ($mensagemAcao !== '' || $resposta !== '') {
            $last = $pdo->prepare('UPDATE suporte_chamados SET ultima_mensagem_em = NOW() WHERE id = ?');
            $last->execute([$idChamado]);
        }

        $pdo->commit();
        admin_flash('Chamado atualizado.');
    } catch (Throwable $e) {
        if ($pdo->inTransaction()) {
            $pdo->rollBack();
        }
        admin_flash('Erro ao atualizar chamado: ' . $e->getMessage(), 'error');
    }

    header('Location: suporte.php?id=' . $idChamado);
    exit;
}

$statusFiltro = trim((string) ($_GET['status'] ?? ''));
$categoriaFiltro = trim((string) ($_GET['categoria'] ?? ''));
$q = trim((string) ($_GET['q'] ?? ''));
$atendenteFiltro = trim((string) ($_GET['atendente'] ?? ''));
$idSelecionado = (int) ($_GET['id'] ?? 0);
$adminAtual = admin_current_user();
$atendenteOpcoes = [
    '' => 'Todos',
    'meus_em_atendimento' => 'Meus em atendimento',
    'meus' => 'Todos meus chamados',
    'sem_responsavel' => 'Sem responsavel',
];
if (!array_key_exists($atendenteFiltro, $atendenteOpcoes)) {
    $atendenteFiltro = '';
}

$chamados = admin_suporte_chamados($statusFiltro, $categoriaFiltro, $q, $atendenteFiltro, $adminAtual);
if ($idSelecionado <= 0 && $chamados) {
    $idSelecionado = (int) $chamados[0]['id'];
}
$selecionado = $idSelecionado > 0 ? admin_suporte_chamado($idSelecionado) : null;
$mensagens = $selecionado ? admin_suporte_mensagens($idSelecionado) : [];
$resumo = admin_suporte_resumo();
$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 - Suporte</title>
  <link rel="stylesheet" href="assets/admin.css?v=20260626-1">
</head>
<body>
  <?php admin_sidebar('suporte'); ?>

  <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>Suporte</h1>
        <p>Triagem e atendimento de chamados abertos pelos motoristas.</p>
      </div>
      <div class="panel-body">
        <form class="support-filters" method="get" action="suporte.php">
          <div class="field">
            <label for="status">Status</label>
            <select id="status" name="status">
              <option value="">Todos</option>
              <?php foreach ($statuses as $key => $label): ?>
                <option value="<?= e($key) ?>" <?= $statusFiltro === $key ? 'selected' : '' ?>><?= e($label) ?></option>
              <?php endforeach; ?>
            </select>
          </div>
          <div class="field">
            <label for="categoria">Categoria</label>
            <select id="categoria" name="categoria">
              <option value="">Todas</option>
              <?php foreach ($categorias as $key => $label): ?>
                <option value="<?= e($key) ?>" <?= $categoriaFiltro === $key ? 'selected' : '' ?>><?= e($label) ?></option>
              <?php endforeach; ?>
            </select>
          </div>
          <div class="field">
            <label for="atendente">Atendente</label>
            <select id="atendente" name="atendente">
              <?php foreach ($atendenteOpcoes as $key => $label): ?>
                <option value="<?= e($key) ?>" <?= $atendenteFiltro === $key ? 'selected' : '' ?>><?= e($label) ?></option>
              <?php endforeach; ?>
            </select>
          </div>
          <div class="field">
            <label for="q">Busca</label>
            <input id="q" name="q" value="<?= e($q) ?>" placeholder="ID, motorista, titulo, e-mail ou telefone">
          </div>
          <button class="button" type="submit">Filtrar</button>
        </form>
      </div>
    </section>

    <section class="metric-grid">
      <div class="stat-card stat-blue"><div><strong><?= e((string) $resumo['abertos']) ?></strong><span>Abertos</span><small>Entraram e ainda precisam de triagem</small></div></div>
      <div class="stat-card stat-gold"><div><strong><?= e((string) $resumo['atendimento']) ?></strong><span>Em atendimento</span><small>Chamados assumidos pela equipe</small></div></div>
      <div class="stat-card stat-orange"><div><strong><?= e((string) $resumo['aguardando']) ?></strong><span>Aguardando motorista</span><small>Dependem de resposta no app</small></div></div>
      <div class="stat-card stat-green"><div><strong><?= e((string) $resumo['resolvidos']) ?></strong><span>Resolvidos</span><small>Atendidos ou fechados</small></div></div>
    </section>

    <section class="support-layout">
      <div class="panel">
        <div class="panel-header">
          <h1>Chamados</h1>
          <p><?= e((string) count($chamados)) ?> encontrados.</p>
        </div>
        <div class="support-list">
          <?php foreach ($chamados as $chamado): ?>
            <a class="support-ticket <?= (int) $chamado['id'] === $idSelecionado ? 'active' : '' ?>" href="suporte.php?<?= e(http_build_query(['id' => $chamado['id'], 'status' => $statusFiltro, 'categoria' => $categoriaFiltro, 'atendente' => $atendenteFiltro, 'q' => $q])) ?>">
              <div>
                <strong>#<?= e((string) $chamado['id']) ?> <?= e((string) $chamado['titulo']) ?></strong>
                <span><?= e((string) $chamado['usuario_nome']) ?> | <?= e((string) $chamado['usuario_email']) ?></span>
                <small>Atendido por: <?= e((string) ($chamado['admin_responsavel'] ?: 'sem responsavel')) ?></small>
                <small><?= e(admin_suporte_categoria_label($chamado)) ?> | <?= e((string) ($chamado['ultima_mensagem'] ?? $chamado['descricao'])) ?></small>
              </div>
              <div class="support-ticket-meta">
                <span class="badge <?= e(suporte_status_class((string) $chamado['status'])) ?>"><?= e(suporte_status_label((string) $chamado['status'])) ?></span>
                <span class="badge <?= e(suporte_prioridade_class((string) $chamado['prioridade'])) ?>"><?= e(suporte_prioridade_label((string) $chamado['prioridade'])) ?></span>
                <?php if ((int) ($chamado['nao_lidas_admin'] ?? 0) > 0): ?>
                  <span class="badge badge-bad"><?= e((string) $chamado['nao_lidas_admin']) ?> nova(s)</span>
                <?php endif; ?>
                <small><?= e((string) $chamado['ultima_mensagem_em']) ?></small>
              </div>
            </a>
          <?php endforeach; ?>
          <?php if (!$chamados): ?><div class="panel-body">Nenhum chamado encontrado.</div><?php endif; ?>
        </div>
      </div>

      <div class="panel support-detail">
        <?php if (!$selecionado): ?>
          <div class="panel-body">Selecione um chamado para atender.</div>
        <?php else: ?>
          <div class="panel-header">
            <h1>#<?= e((string) $selecionado['id']) ?> <?= e((string) $selecionado['titulo']) ?></h1>
            <p>Aberto por <?= e(ucfirst((string) $selecionado['tipo_usuario'])) ?> #<?= e((string) $selecionado['id_usuario']) ?> | <?= e((string) $selecionado['usuario_nome']) ?> | <?= e((string) $selecionado['usuario_email']) ?> | <?= e((string) $selecionado['usuario_celular']) ?></p>
          </div>
          <div class="panel-body">
            <div class="support-operator">
              <div>
                <span>Aberto por</span>
                <strong><?= e(ucfirst((string) $selecionado['tipo_usuario'])) ?> #<?= e((string) $selecionado['id_usuario']) ?> - <?= e((string) $selecionado['usuario_nome']) ?></strong>
              </div>
              <div>
                <span>Atendido por</span>
                <strong><?= e((string) ($selecionado['admin_responsavel'] ?: 'Nenhum admin assumiu')) ?></strong>
              </div>
            </div>

            <div class="support-quick-actions">
              <form method="post" action="suporte.php?id=<?= e((string) $selecionado['id']) ?>">
                <input type="hidden" name="id_chamado" value="<?= e((string) $selecionado['id']) ?>">
                <button class="button" type="submit" name="acao" value="assumir">
                  <?= empty($selecionado['admin_responsavel']) ? 'Assumir atendimento' : 'Enviar para em atendimento' ?>
                </button>
              </form>
              <form method="post" action="suporte.php?id=<?= e((string) $selecionado['id']) ?>">
                <input type="hidden" name="id_chamado" value="<?= e((string) $selecionado['id']) ?>">
                <button class="button warning" type="submit" name="acao" value="aguardar_motorista">Aguardar motorista</button>
              </form>
              <form method="post" action="suporte.php?id=<?= e((string) $selecionado['id']) ?>">
                <input type="hidden" name="id_chamado" value="<?= e((string) $selecionado['id']) ?>">
                <button class="button success" type="submit" name="acao" value="finalizar">Finalizar atendimento</button>
              </form>
            </div>

            <div class="support-context">
              <div><span>Categoria</span><strong><?= e(admin_suporte_categoria_label($selecionado)) ?></strong></div>
              <div><span>Status</span><strong><?= e(suporte_status_label((string) $selecionado['status'])) ?></strong></div>
              <div><span>Prioridade</span><strong><?= e(suporte_prioridade_label((string) $selecionado['prioridade'])) ?></strong></div>
              <div><span>Responsavel</span><strong><?= e((string) ($selecionado['admin_responsavel'] ?? '--')) ?></strong></div>
              <div><span>Corrida</span><strong><?= $selecionado['id_corrida'] ? '#' . e((string) $selecionado['id_corrida']) . ' - ' . e((string) ($selecionado['corrida_status'] ?? '--')) : '--' ?></strong></div>
              <div><span>Veículo</span><strong><?= trim((string) ($selecionado['veiculo_marca'] ?? '') . ' ' . (string) ($selecionado['veiculo_modelo'] ?? '') . ' ' . (string) ($selecionado['veiculo_placa'] ?? '')) ?: '--' ?></strong></div>
            </div>

            <div class="support-description">
              <strong>Descrição inicial</strong>
              <p><?= nl2br(e((string) $selecionado['descricao'])) ?></p>
            </div>

            <div class="support-chat">
              <?php foreach ($mensagens as $mensagem): ?>
                <div class="support-message <?= $mensagem['remetente_tipo'] === 'admin' ? 'admin' : 'driver' ?>">
                  <strong><?= e((string) ($mensagem['nome_remetente'] ?? $mensagem['remetente_tipo'])) ?></strong>
                  <p><?= nl2br(e((string) $mensagem['mensagem'])) ?></p>
                  <span><?= e((string) $mensagem['criado_em']) ?></span>
                </div>
              <?php endforeach; ?>
            </div>

            <form method="post" action="suporte.php" class="support-reply">
              <input type="hidden" name="id_chamado" value="<?= e((string) $selecionado['id']) ?>">
              <input type="hidden" name="acao" value="salvar">
              <div class="grid">
                <div class="field">
                  <label for="status_atendimento">Status</label>
                  <select id="status_atendimento" name="status">
                    <?php foreach ($statuses as $key => $label): ?>
                      <option value="<?= e($key) ?>" <?= $selecionado['status'] === $key ? 'selected' : '' ?>><?= e($label) ?></option>
                    <?php endforeach; ?>
                  </select>
                </div>
                <div class="field">
                  <label for="prioridade_atendimento">Prioridade</label>
                  <select id="prioridade_atendimento" name="prioridade">
                    <?php foreach ($prioridades as $key => $label): ?>
                      <option value="<?= e($key) ?>" <?= $selecionado['prioridade'] === $key ? 'selected' : '' ?>><?= e($label) ?></option>
                    <?php endforeach; ?>
                  </select>
                </div>
              </div>
              <div class="field">
                <label for="resposta">Resposta para o motorista</label>
                <textarea id="resposta" name="resposta" rows="4" placeholder="Digite a orientação ou pergunta para o motorista..."></textarea>
              </div>
              <div class="actions">
                <button class="button" type="submit">Salvar atendimento</button>
              </div>
            </form>
          </div>
        <?php endif; ?>
      </div>
    </section>
  </main>
</body>
</html>
<?php
function admin_suporte_categoria_label(array $chamado): string
{
    $categoria = (string) ($chamado['categoria'] ?? '');
    $tipoUsuario = (string) ($chamado['tipo_usuario'] ?? '');

    if ($tipoUsuario === 'passageiro' && $categoria === 'item_encontrado') {
        return 'Item perdido';
    }

    return suporte_categoria_label($categoria);
}

function admin_suporte_resumo(): array
{
    $row = db()->query(
        'SELECT
            SUM(CASE WHEN status = "aberto" THEN 1 ELSE 0 END) AS abertos,
            SUM(CASE WHEN status = "em_atendimento" THEN 1 ELSE 0 END) AS atendimento,
            SUM(CASE WHEN status = "aguardando_motorista" THEN 1 ELSE 0 END) AS aguardando,
            SUM(CASE WHEN status IN ("resolvido", "fechado") THEN 1 ELSE 0 END) AS resolvidos
         FROM suporte_chamados'
    )->fetch() ?: [];

    return [
        'abertos' => (int) ($row['abertos'] ?? 0),
        'atendimento' => (int) ($row['atendimento'] ?? 0),
        'aguardando' => (int) ($row['aguardando'] ?? 0),
        'resolvidos' => (int) ($row['resolvidos'] ?? 0),
    ];
}

function admin_suporte_chamados(string $status, string $categoria, string $q, string $atendente, string $admin): array
{
    $params = [];
    $where = ' WHERE 1=1';
    if ($status !== '' && $atendente !== 'meus_em_atendimento' && array_key_exists($status, suporte_statuses())) {
        $where .= ' AND sc.status = ?';
        $params[] = $status;
    }

    if ($atendente === 'meus_em_atendimento') {
        $where .= ' AND sc.status = "em_atendimento" AND sc.admin_responsavel = ?';
        $params[] = $admin;
    } elseif ($atendente === 'meus') {
        $where .= ' AND sc.admin_responsavel = ?';
        $params[] = $admin;
    } elseif ($atendente === 'sem_responsavel') {
        $where .= ' AND (sc.admin_responsavel IS NULL OR sc.admin_responsavel = "")';
    }

    if ($categoria !== '' && array_key_exists($categoria, suporte_categorias())) {
        $where .= ' AND sc.categoria = ?';
        $params[] = $categoria;
    }
    if ($q !== '') {
        $like = '%' . $q . '%';
        $where .= ' AND (sc.id = ? OR sc.titulo LIKE ? OR sc.descricao LIKE ? OR u.nome LIKE ? OR u.email LIKE ? OR u.celular LIKE ?)';
        $params[] = ctype_digit($q) ? (int) $q : 0;
        array_push($params, $like, $like, $like, $like, $like);
    }

    $stmt = db()->prepare(
        'SELECT sc.*, u.nome AS usuario_nome, u.email AS usuario_email, u.celular AS usuario_celular,
                (
                  SELECT sm.mensagem
                  FROM suporte_mensagens sm
                  WHERE sm.id_chamado = sc.id
                  ORDER BY sm.criado_em DESC, sm.id DESC
                  LIMIT 1
                ) AS ultima_mensagem,
                (
                  SELECT COUNT(*)
                  FROM suporte_mensagens sm
                  WHERE sm.id_chamado = sc.id
                    AND sm.remetente_tipo IN ("motorista", "passageiro")
                    AND sm.lido_admin = 0
                ) AS nao_lidas_admin
         FROM suporte_chamados sc
         INNER JOIN usuarios u ON u.id = sc.id_usuario' . $where . '
         ORDER BY sc.ultima_mensagem_em DESC, sc.id DESC
         LIMIT 200'
    );
    $stmt->execute($params);

    return $stmt->fetchAll();
}

function admin_suporte_chamado(int $id): ?array
{
    $stmt = db()->prepare(
        'SELECT sc.*, u.nome AS usuario_nome, u.email AS usuario_email, u.celular AS usuario_celular,
                c.status AS corrida_status, c.valor AS corrida_valor, c.forma_pagamento AS corrida_pagamento,
                v.marca AS veiculo_marca, v.modelo AS veiculo_modelo, v.cor AS veiculo_cor, v.placa AS veiculo_placa
         FROM suporte_chamados sc
         INNER JOIN usuarios u ON u.id = sc.id_usuario
         LEFT JOIN corridas c ON c.id = sc.id_corrida
         LEFT JOIN veiculos v ON v.id = sc.id_veiculo
         WHERE sc.id = ?
         LIMIT 1'
    );
    $stmt->execute([$id]);
    $chamado = $stmt->fetch();
    if ($chamado) {
        $up = db()->prepare(
            'UPDATE suporte_mensagens
             SET lido_admin = 1
             WHERE id_chamado = ? AND remetente_tipo IN ("motorista", "passageiro")'
        );
        $up->execute([$id]);
    }

    return $chamado ?: null;
}

function admin_suporte_mensagens(int $id): array
{
    $stmt = db()->prepare(
        'SELECT id, remetente_tipo, nome_remetente, mensagem, anexo_url, criado_em
         FROM suporte_mensagens
         WHERE id_chamado = ?
         ORDER BY criado_em ASC, id ASC'
    );
    $stmt->execute([$id]);

    return $stmt->fetchAll();
}
