<?php
/**
 * modules/admin/users.php — gestión de usuarios (listado · alta · ficha).
 */
if (!defined('IN_APP')) { die('Acceso denegado'); }

$admin = new Admin($mysqli, $_config);
$plans = $admin->listPlans();

$id       = (int)$_id;

// AJAX: mensajes de una sesión (lo carga la pestaña Sesiones al desplegar).
if ($id > 0 && isset($_GET['ajax_messages'])) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($admin->sessionMessages((int)$_GET['ajax_messages'], $id));
    exit;
}

$creating = (($_segments[2] ?? '') === 'new');
$editing  = !$creating && $id > 0;
$error    = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['create_user'])) {
        $ok = $admin->createUser($_POST['name'] ?? '', $_POST['email'] ?? '', $_POST['password'] ?? '', $_POST['id_plan'] ?? null, !empty($_POST['is_admin']), !empty($_POST['is_org']), $_POST['max_accounts'] ?? 0);
        if ($ok) App::redirect('/admin/users/');
        $error = $admin->_error; $creating = true;
    } elseif (isset($_POST['update_user']) && $id > 0) {
        $ok = $admin->updateUser($id, $_POST['name'] ?? '', $_POST['email'] ?? '', $_POST['id_plan'] ?? null, !empty($_POST['is_admin']), $_POST['password'] ?? '', !empty($_POST['is_org']), $_POST['max_accounts'] ?? 0);
        if ($ok) App::redirect('/admin/users/' . $id . '/');
        $error = $admin->_error; $editing = true;
    } elseif (isset($_POST['suspend']) && $id > 0 && $id !== (int)$_user['id_user']) {
        $admin->setUserActive($id, (int)$_POST['suspend']);
        App::redirect('/admin/users/' . $id . '/');
    } elseif (!empty($_POST['delete_user']) && $id > 0 && $id !== (int)$_user['id_user']) {
        $admin->deleteUser($id);
        App::redirect('/admin/users/');
    }
}

$page_title = App::t('user.title');

/* ---------- ALTA ---------- */
if ($creating):
    $page_title   = App::t('user.new');
    $page_actions = '<a href="/admin/users/" class="rounded-lg border border-gray-200 px-3 py-1.5 text-sm hover:bg-gray-50 dark:border-ink-700 dark:hover:bg-ink-800">' . App::e(App::t('common.back')) . '</a>';
?>
<div class="px-4 py-6">
  <section class="max-w-2xl rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">
    <div class="border-b border-gray-200 px-4 py-3 dark:border-ink-700"><h2 class="font-medium"><?= App::e(App::t('user.new')) ?></h2></div>
    <form method="post" action="/admin/users/new/" class="space-y-4 px-4 py-4">
      <?php if ($error): ?><div class="rounded-lg border border-danger/30 bg-danger/10 px-4 py-3 text-sm text-danger"><?= App::e($error) ?></div><?php endif; ?>
      <div class="grid gap-4 sm:grid-cols-2">
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('auth.name')) ?></label>
          <input type="text" name="name" required class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800"></div>
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('auth.email')) ?></label>
          <input type="email" name="email" required class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800"></div>
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('auth.password')) ?></label>
          <div class="flex items-center gap-2">
            <input type="password" name="password" required minlength="8" data-pass-input class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800">
            <button type="button" data-genpass class="shrink-0 rounded-lg border border-gray-200 px-3 py-2 text-sm hover:bg-gray-50 dark:border-ink-700 dark:hover:bg-ink-800"><?= App::e(App::t('common.generate')) ?></button>
          </div></div>
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('user.plan')) ?></label>
          <select name="id_plan" class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800">
            <option value=""><?= App::e(App::t('user.no_plan')) ?></option>
            <?php foreach ($plans as $p): ?><option value="<?= (int)$p['id_plan'] ?>"><?= App::e($p['name']) ?></option><?php endforeach; ?>
          </select></div>
      </div>
      <label class="flex items-center gap-2 text-sm"><input type="checkbox" name="is_admin" value="1" class="h-4 w-4 accent-primary-600"> <?= App::e(App::t('user.is_admin')) ?></label>
      <div class="rounded-lg border border-gray-200 px-4 py-3 dark:border-ink-700">
        <label class="flex items-center gap-2 text-sm"><input type="checkbox" name="is_org" value="1" data-org-toggle class="h-4 w-4 accent-primary-600"> <?= App::e(App::t('user.is_org')) ?></label>
        <div data-org-fields class="mt-3 hidden">
          <label class="mb-1 block text-sm font-medium"><?= App::e(App::t('user.max_accounts')) ?></label>
          <input type="number" name="max_accounts" min="0" value="0" class="w-40 rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800">
        </div>
      </div>
      <button name="create_user" value="1" class="rounded-lg bg-primary-600 px-4 py-2 text-sm font-medium text-white hover:bg-primary-700"><?= App::e(App::t('user.add')) ?></button>
    </form>
  </section>
</div>

<?php
/* ---------- FICHA / EDICIÓN ---------- */
elseif ($editing):
    $u = $admin->getUser($id);
    if (!$u) App::redirect('/admin/users/');
    $page_title   = App::e($u['name']);
    $page_actions = '<a href="/admin/users/" class="rounded-lg border border-gray-200 px-3 py-1.5 text-sm hover:bg-gray-50 dark:border-ink-700 dark:hover:bg-ink-800">' . App::e(App::t('common.back')) . '</a>';
    $self = ($id === (int)$_user['id_user']);
    // Datos para las pestañas (todas se renderizan; el cambio es por JavaScript).
    $st     = $admin->userStats($id);
    $bm     = $admin->userByModel($id);
    $daily  = $admin->userDaily($id);
    $rows30 = $admin->userDailyRows($id, 30);
    $sessions = $admin->userSessions($id);
    $brands   = $admin->brands();
    $on  = 'bg-white text-primary-700 shadow-sm dark:bg-ink-900 dark:text-primary-300';
    $off = 'text-gray-dark hover:text-ink-900 dark:text-gray-light dark:hover:text-white';
?>
<div class="space-y-6 px-4 py-6">
  <!-- Pestañas Datos | Uso | Sesiones (por JavaScript, sin recargar) -->
  <div class="inline-flex gap-1 rounded-lg border border-gray-200 bg-gray-100 p-1 dark:border-ink-700 dark:bg-ink-800" data-tabs="userficha">
    <button type="button" data-tab="datos"    data-tab-group="userficha" class="rounded-md px-4 py-2 text-sm font-medium <?= $on ?>"><?= App::e(App::t('user.tab_data')) ?></button>
    <button type="button" data-tab="uso"       data-tab-group="userficha" class="rounded-md px-4 py-2 text-sm font-medium <?= $off ?>"><?= App::e(App::t('user.tab_usage')) ?></button>
    <button type="button" data-tab="sesiones"  data-tab-group="userficha" class="rounded-md px-4 py-2 text-sm font-medium <?= $off ?>"><?= App::e(App::t('user.tab_sessions')) ?> (<?= count($sessions) ?>)</button>
  </div>

  <!-- ===== Panel Datos ===== -->
  <div data-tab-panel="datos" data-tab-group="userficha" class="space-y-6">
  <section class="max-w-2xl rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">
    <div class="border-b border-gray-200 px-4 py-3 dark:border-ink-700"><h2 class="font-medium"><?= App::e(App::t('user.edit')) ?></h2></div>
    <form method="post" action="/admin/users/<?= $id ?>/" class="space-y-4 px-4 py-4">
      <?php if ($error): ?><div class="rounded-lg border border-danger/30 bg-danger/10 px-4 py-3 text-sm text-danger"><?= App::e($error) ?></div><?php endif; ?>
      <div class="grid gap-4 sm:grid-cols-2">
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('auth.name')) ?></label>
          <input type="text" name="name" required value="<?= App::e($u['name']) ?>" class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800"></div>
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('auth.email')) ?></label>
          <input type="email" name="email" required value="<?= App::e($u['email']) ?>" class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800"></div>
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('user.plan')) ?></label>
          <select name="id_plan" class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800">
            <option value=""><?= App::e(App::t('user.no_plan')) ?></option>
            <?php foreach ($plans as $p): ?><option value="<?= (int)$p['id_plan'] ?>" <?= (int)$u['id_plan'] === (int)$p['id_plan'] ? 'selected' : '' ?>><?= App::e($p['name']) ?></option><?php endforeach; ?>
          </select></div>
        <div><label class="mb-1 block text-sm font-medium"><?= App::e(App::t('user.password_new')) ?></label>
          <div class="flex items-center gap-2">
            <input type="password" name="password" minlength="8" placeholder="<?= App::e(App::t('user.password_keep')) ?>" data-pass-input class="w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800">
            <button type="button" data-genpass class="shrink-0 rounded-lg border border-gray-200 px-3 py-2 text-sm hover:bg-gray-50 dark:border-ink-700 dark:hover:bg-ink-800"><?= App::e(App::t('common.generate')) ?></button>
          </div></div>
      </div>
      <label class="flex items-center gap-2 text-sm"><input type="checkbox" name="is_admin" value="1" <?= (int)$u['is_admin'] === 1 ? 'checked' : '' ?> class="h-4 w-4 accent-primary-600"> <?= App::e(App::t('user.is_admin')) ?></label>
      <div class="rounded-lg border border-gray-200 px-4 py-3 dark:border-ink-700">
        <label class="flex items-center gap-2 text-sm"><input type="checkbox" name="is_org" value="1" data-org-toggle <?= (int)$u['is_org'] === 1 ? 'checked' : '' ?> class="h-4 w-4 accent-primary-600"> <?= App::e(App::t('user.is_org')) ?></label>
        <div data-org-fields class="mt-3 <?= (int)$u['is_org'] === 1 ? '' : 'hidden' ?>">
          <label class="mb-1 block text-sm font-medium"><?= App::e(App::t('user.max_accounts')) ?></label>
          <input type="number" name="max_accounts" min="0" value="<?= (int)$u['max_accounts'] ?>" class="w-40 rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm dark:border-ink-700 dark:bg-ink-800">
        </div>
      </div>
      <button name="update_user" value="1" class="rounded-lg bg-primary-600 px-4 py-2 text-sm font-medium text-white hover:bg-primary-700"><?= App::e(App::t('common.save')) ?></button>
    </form>
  </section>

  <?php if (!$self): ?>
  <section class="max-w-2xl rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">
    <div class="border-b border-gray-200 px-4 py-3 dark:border-ink-700"><h2 class="font-medium"><?= App::e(App::t('user.danger')) ?></h2></div>
    <div class="flex flex-wrap items-center gap-3 px-4 py-4">
      <form method="post" action="/admin/users/<?= $id ?>/">
        <input type="hidden" name="suspend" value="<?= (int)$u['is_active'] === 1 ? 0 : 1 ?>">
        <button class="rounded-lg border border-gray-200 px-3 py-1.5 text-sm hover:bg-gray-50 dark:border-ink-700 dark:hover:bg-ink-800">
          <?= App::e((int)$u['is_active'] === 1 ? App::t('user.suspend') : App::t('user.activate')) ?>
        </button>
      </form>
      <form method="post" action="/admin/users/<?= $id ?>/" onsubmit="return confirm('<?= App::e(App::t('user.delete_confirm')) ?>');">
        <button name="delete_user" value="1" class="rounded-lg border border-danger/30 px-3 py-1.5 text-sm text-danger hover:bg-danger/10"><?= App::e(App::t('user.delete')) ?></button>
      </form>
      <span class="text-xs text-gray-dark dark:text-gray-light"><?= (int)$u['is_active'] === 1 ? App::e(App::t('user.active')) : App::e(App::t('user.suspended')) ?></span>
    </div>
  </section>
  <?php endif; ?>
  </div><!-- /panel datos -->

  <!-- ===== Panel Uso ===== -->
  <div data-tab-panel="uso" data-tab-group="userficha" class="hidden">
  <section class="rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">
    <div class="border-b border-gray-200 px-4 py-3 dark:border-ink-700"><h2 class="font-medium"><?= App::e(App::t('user.usage')) ?></h2></div>
    <div class="space-y-5 px-4 py-4">

      <!-- Cards -->
      <div class="grid gap-3 sm:grid-cols-3 lg:grid-cols-6">
        <div class="rounded-lg border border-gray-200 px-3 py-3 dark:border-ink-700"><div class="text-xs text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_sessions')) ?></div><div class="mt-1 text-xl font-semibold"><?= (int)$st['sess'] ?></div></div>
        <div class="rounded-lg border border-gray-200 px-3 py-3 dark:border-ink-700"><div class="text-xs text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_requests')) ?></div><div class="mt-1 text-xl font-semibold"><?= (int)$st['req'] ?></div></div>
        <div class="rounded-lg border border-gray-200 px-3 py-3 dark:border-ink-700"><div class="text-xs text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_tokens_in')) ?></div><div class="mt-1 text-xl font-semibold"><?= number_format((int)$st['tin']) ?></div></div>
        <div class="rounded-lg border border-gray-200 px-3 py-3 dark:border-ink-700"><div class="text-xs text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_tokens_out')) ?></div><div class="mt-1 text-xl font-semibold"><?= number_format((int)$st['tout']) ?></div></div>
        <div class="rounded-lg border border-gray-200 px-3 py-3 dark:border-ink-700"><div class="text-xs text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_cached')) ?></div><div class="mt-1 text-xl font-semibold"><?= number_format((int)$st['tcached']) ?></div></div>
        <div class="rounded-lg border border-gray-200 px-3 py-3 dark:border-ink-700"><div class="text-xs text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_cost')) ?></div><div class="mt-1 text-xl font-semibold">$<?= App::e(number_format((float)$st['cost'], 4)) ?></div></div>
      </div>

      <!-- Heatmap tipo GitHub -->
      <div>
        <div class="mb-2 text-xs font-medium text-gray-dark dark:text-gray-light"><?= App::e(App::t('user.activity')) ?></div>
        <?php include __DIR__ . '/../../inc/heatmap.php'; ?>
      </div>

      <!-- Por modelo -->
      <div class="overflow-hidden rounded-lg border border-gray-200 dark:border-ink-700">
        <table class="w-full text-sm">
          <thead><tr class="border-b border-gray-200 bg-gray-50 text-left text-xs uppercase tracking-wide text-gray-dark dark:border-ink-700 dark:bg-ink-800 dark:text-gray-light">
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.u_model')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_requests')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_tokens_in')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_tokens_out')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_cached')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_cost')) ?></th>
          </tr></thead>
          <tbody class="divide-y divide-gray-200 dark:divide-ink-700">
            <?php if (!$bm): ?>
              <tr><td colspan="6" class="px-4 py-3 text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_empty')) ?></td></tr>
            <?php else: foreach ($bm as $r): ?>
              <tr>
                <td class="px-4 py-2 font-mono text-xs"><?= App::e($r['model'] ?: '—') ?></td>
                <td class="px-4 py-2 text-right"><?= (int)$r['req'] ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$r['tin']) ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$r['tout']) ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$r['tcached']) ?></td>
                <td class="px-4 py-2 text-right font-medium">$<?= App::e(number_format((float)$r['cost'], 4)) ?></td>
              </tr>
            <?php endforeach; endif; ?>
          </tbody>
        </table>
      </div>

      <!-- Últimos 30 días -->
      <div class="overflow-hidden rounded-lg border border-gray-200 dark:border-ink-700">
        <div class="border-b border-gray-200 bg-gray-50 px-4 py-2 text-xs font-semibold uppercase tracking-wide text-gray-dark dark:border-ink-700 dark:bg-ink-800 dark:text-gray-light"><?= App::e(App::t('user.last30')) ?></div>
        <table class="w-full text-sm">
          <thead><tr class="border-b border-gray-200 bg-gray-50 text-left text-xs uppercase tracking-wide text-gray-dark dark:border-ink-700 dark:bg-ink-800 dark:text-gray-light">
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('user.date')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_requests')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_sessions')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_tokens_in')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_tokens_out')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_cached')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_cost')) ?></th>
          </tr></thead>
          <tbody class="divide-y divide-gray-200 dark:divide-ink-700">
            <?php if (!$rows30): ?>
              <tr><td colspan="7" class="px-4 py-3 text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.u_empty')) ?></td></tr>
            <?php else: foreach ($rows30 as $r): ?>
              <tr>
                <td class="px-4 py-2"><?= App::e($r['d']) ?></td>
                <td class="px-4 py-2 text-right"><?= (int)$r['req'] ?></td>
                <td class="px-4 py-2 text-right"><?= (int)$r['sess'] ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$r['tin']) ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$r['tout']) ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$r['tcached']) ?></td>
                <td class="px-4 py-2 text-right font-medium">$<?= App::e(number_format((float)$r['cost'], 4)) ?></td>
              </tr>
            <?php endforeach; endif; ?>
          </tbody>
        </table>
      </div>
    </div>
  </section>
  </div><!-- /panel uso -->

  <!-- ===== Panel Sesiones ===== -->
  <div data-tab-panel="sesiones" data-tab-group="userficha" class="hidden">
    <div class="overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">
      <div class="overflow-x-auto">
        <table class="w-full text-sm">
          <thead><tr class="border-b border-gray-200 bg-gray-50 text-left text-xs uppercase tracking-wide text-gray-dark dark:border-ink-700 dark:bg-ink-800 dark:text-gray-light">
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('user.session_updated')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.u_model')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('user.messages')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_requests')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_tokens_in')) ?></th>
            <th class="px-4 py-2 text-right font-semibold"><?= App::e(App::t('admin.u_tokens_out')) ?></th>
          </tr></thead>
          <tbody class="divide-y divide-gray-200 dark:divide-ink-700">
            <?php if (!$sessions): ?>
              <tr><td colspan="6" class="px-4 py-4 text-gray-dark dark:text-gray-light"><?= App::e(App::t('user.no_sessions')) ?></td></tr>
            <?php else: foreach ($sessions as $sx):
              $sid = (int)$sx['id_session'];
              $mlabel = !empty($brands[$sx['model']]) ? $brands[$sx['model']] : App::t('admin.hidden'); ?>
              <tr data-session-row data-session-id="<?= $sid ?>" data-session-url="/admin/users/<?= $id ?>/" class="cursor-pointer hover:bg-gray-50 dark:hover:bg-ink-800/50">
                <td class="whitespace-nowrap px-4 py-2"><?= App::e($sx['updated_at']) ?></td>
                <td class="px-4 py-2 text-xs"><?= App::e($mlabel) ?></td>
                <td class="px-4 py-2 text-right"><?= (int)$sx['msgs'] ?></td>
                <td class="px-4 py-2 text-right"><?= (int)$sx['req'] ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$sx['tin']) ?></td>
                <td class="px-4 py-2 text-right"><?= number_format((int)$sx['tout']) ?></td>
              </tr>
              <tr data-session-detail="<?= $sid ?>" class="hidden">
                <td colspan="6" class="bg-gray-50 px-4 py-3 dark:bg-ink-800/50">
                  <div data-session-body class="max-h-96 space-y-3 overflow-y-auto text-xs"></div>
                </td>
              </tr>
            <?php endforeach; endif; ?>
          </tbody>
        </table>
      </div>
    </div>
  </div><!-- /panel sesiones -->
</div>

<?php
/* ---------- LISTADO ---------- */
else:
    $users = $admin->listUsers();
    $page_actions = '<a href="/admin/users/new/" class="rounded-lg bg-primary-600 px-3 py-1.5 text-sm font-medium text-white hover:bg-primary-700">' . App::e(App::t('user.add')) . '</a>';
?>
<div class="px-4 py-6">
  <div class="overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">
    <div class="overflow-x-auto">
      <table class="w-full text-sm">
        <thead>
          <tr class="border-b border-gray-200 bg-gray-50 text-left text-xs uppercase tracking-wide text-gray-dark dark:border-ink-700 dark:bg-ink-800 dark:text-gray-light">
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('auth.name')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('auth.email')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('user.plan')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('user.state')) ?></th>
          </tr>
          <tr class="border-b border-gray-200 bg-gray-50 dark:border-ink-700 dark:bg-ink-800">
            <th class="px-3 py-2"><input type="search" data-col-filter="name" data-filter-target="users" placeholder="<?= App::e(App::t('admin.filter')) ?>" class="w-full rounded-md border border-gray-200 bg-white px-2 py-1 text-xs font-normal outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-900"></th>
            <th class="px-3 py-2"><input type="search" data-col-filter="email" data-filter-target="users" placeholder="<?= App::e(App::t('admin.filter')) ?>" class="w-full rounded-md border border-gray-200 bg-white px-2 py-1 text-xs font-normal outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-900"></th>
            <th class="px-3 py-2"><input type="search" data-col-filter="plan" data-filter-target="users" placeholder="<?= App::e(App::t('admin.filter')) ?>" class="w-full rounded-md border border-gray-200 bg-white px-2 py-1 text-xs font-normal outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-900"></th>
            <th class="px-3 py-2">
              <select data-col-filter="state" data-filter-target="users" class="w-full rounded-md border border-gray-200 bg-white px-2 py-1 text-xs font-normal outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-900">
                <option value=""><?= App::e(App::t('admin.cap_all')) ?></option>
                <option value="active"><?= App::e(App::t('user.active')) ?></option>
                <option value="suspended"><?= App::e(App::t('user.suspended')) ?></option>
                <option value="admin"><?= App::e(App::t('user.is_admin')) ?></option>
                <option value="org"><?= App::e(App::t('user.is_org')) ?></option>
              </select>
            </th>
          </tr>
        </thead>
        <tbody class="divide-y divide-gray-200 dark:divide-ink-700" data-filter-list="users">
          <?php foreach ($users as $u):
            $state = ((int)$u['is_active'] === 1 ? 'active' : 'suspended')
                   . ((int)$u['is_admin'] === 1 ? ' admin' : '')
                   . ((int)$u['is_org'] === 1 ? ' org' : ''); ?>
            <tr data-href="/admin/users/<?= (int)$u['id_user'] ?>/" data-filter-row
                data-col-name="<?= App::e(strtolower($u['name'] . ' ' . ($u['org_name'] ?? ''))) ?>" data-col-email="<?= App::e(strtolower($u['email'])) ?>"
                data-col-plan="<?= App::e(strtolower($u['plan_name'] ?: '')) ?>" data-col-state="<?= App::e($state) ?>"
                class="cursor-pointer hover:bg-gray-50 dark:hover:bg-ink-800/50">
              <td class="px-4 py-2 font-medium">
                <?= App::e($u['name']) ?>
                <?php if (!empty($u['org_name'])): ?><span class="ml-1 text-xs font-normal text-gray-light"><?= App::e(App::t('user.belongs_org')) ?> <?= App::e($u['org_name']) ?></span><?php endif; ?>
              </td>
              <td class="px-4 py-2 text-gray-dark dark:text-gray-light"><?= App::e($u['email']) ?></td>
              <td class="px-4 py-2 text-gray-dark dark:text-gray-light"><?= App::e($u['plan_name'] ?: '—') ?></td>
              <td class="px-4 py-2">
                <?php if ((int)$u['is_admin'] === 1): ?><span class="mr-1 rounded-full bg-primary-50 px-2 py-0.5 text-xs text-primary-700 dark:bg-primary-900/30 dark:text-primary-300"><?= App::e(App::t('user.is_admin')) ?></span><?php endif; ?>
                <?php if ((int)$u['is_org'] === 1): ?><span class="mr-1 rounded-full bg-accent-soft px-2 py-0.5 text-xs text-ink-900"><?= App::e(App::t('user.is_org')) ?></span><?php endif; ?>
                <?php if ((int)$u['is_active'] === 1): ?>
                  <span class="rounded-full bg-success/10 px-2 py-0.5 text-xs text-success"><?= App::e(App::t('user.active')) ?></span>
                <?php else: ?>
                  <span class="rounded-full bg-danger/10 px-2 py-0.5 text-xs text-danger"><?= App::e(App::t('user.suspended')) ?></span>
                <?php endif; ?>
              </td>
            </tr>
          <?php endforeach; ?>
        </tbody>
      </table>
    </div>
  </div>
</div>
<?php endif; ?>
