<?php
/**
 * Página: Gestión de Usuarios
 * Solo visible para Superadmin y Admin. Gestor no tiene acceso.
 * Superadmin: puede todo (añadir, editar, eliminar usuarios). No se puede eliminar ni desactivar FabricioZ907.
 * Admin: añadir usuarios (admin/gestor), activar/desactivar gestores y admins, cambiar contraseñas (sin contraseña actual).
 */

if (!canManageUsers()) {
    header('Location: index.php');
    exit;
}

require_once __DIR__ . '/../../includes/auth.php';
require_once __DIR__ . '/../../includes/db.php';

$mensaje = '';
$error = '';

// ---------- ELIMINAR (solo superadmin, no el superadmin fijo) ----------
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['accion']) && $_POST['accion'] === 'eliminar' && isSuperAdmin()) {
    $id = (int) ($_POST['id'] ?? 0);
    if ($id && !isSuperAdminUser($id)) {
        $stmt = $pdo->prepare("DELETE FROM administradores WHERE id = ? AND usuario != ? LIMIT 1");
        $stmt->execute([$id, SUPERADMIN_USUARIO]);
        if ($stmt->rowCount()) {
            registrarLog(getEventoId(), 'usuario', 'Eliminar', "Usuario eliminado: ID $id");
            $mensaje = 'Usuario eliminado correctamente.';
        } else {
            $error = 'No se pudo eliminar el usuario.';
        }
    } else {
        $error = 'No está permitido eliminar este usuario.';
    }
}

// ---------- AÑADIR USUARIO ----------
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['accion']) && $_POST['accion'] === 'crear') {
    $usuario = sanitize($_POST['usuario'] ?? '');
    $password = $_POST['password'] ?? '';
    $email = sanitize($_POST['email'] ?? '');
    $nombre = sanitize($_POST['nombre'] ?? '');
    $rol = in_array($_POST['rol'] ?? '', ['admin', 'gestor']) ? $_POST['rol'] : 'gestor';
    $evento_id = (int) (getEventoId() ?: 1);

    if (strlen($usuario) < 2) {
        $error = 'El usuario debe tener al menos 2 caracteres.';
    } elseif (strlen($password) < (defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8)) {
        $error = 'La contraseña debe tener al menos ' . (defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8) . ' caracteres.';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = 'Email no válido.';
    } else {
        $stmt = $pdo->prepare("SELECT id FROM administradores WHERE usuario = ? LIMIT 1");
        $stmt->execute([$usuario]);
        if ($stmt->fetch()) {
            $error = 'Ese nombre de usuario ya existe.';
        } else {
            $hash = password_hash($password, PASSWORD_DEFAULT);
            $tieneRolCol = false;
            try { $tieneRolCol = $pdo->query("SHOW COLUMNS FROM administradores LIKE 'rol'")->rowCount() > 0; } catch (Exception $e) { }
            if ($tieneRolCol) {
                $stmt = $pdo->prepare("INSERT INTO administradores (evento_id, usuario, password_hash, email, nombre, activo, rol) VALUES (?, ?, ?, ?, ?, 1, ?)");
                $stmt->execute([$evento_id, $usuario, $hash, $email, $nombre, $rol]);
            } else {
                $stmt = $pdo->prepare("INSERT INTO administradores (evento_id, usuario, password_hash, email, nombre, activo) VALUES (?, ?, ?, ?, ?, 1)");
                $stmt->execute([$evento_id, $usuario, $hash, $email, $nombre]);
            }
            registrarLog($evento_id, 'usuario', 'Crear', "Usuario creado: $usuario ($nombre) - rol $rol");
            $mensaje = 'Usuario creado correctamente.';
        }
    }
}

// ---------- ACTUALIZAR (activo y/o contraseña) ----------
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['accion']) && $_POST['accion'] === 'actualizar') {
    $id = (int) ($_POST['id'] ?? 0);
    $nueva_password = $_POST['nueva_password'] ?? '';
    $activo = isset($_POST['activo']) ? 1 : 0;

    if (!$id) {
        $error = 'ID de usuario no válido.';
    } elseif (isSuperAdminUser($id) && !isSuperAdmin()) {
        $error = 'No tiene permiso para editar este usuario.';
    } elseif (isSuperAdminUser($id)) {
        // No permitir desactivar ni eliminar al superadmin fijo
        $activo = 1;
        $stmt = $pdo->prepare("UPDATE administradores SET activo = 1 WHERE id = ? LIMIT 1");
        $stmt->execute([$id]);
        if (!empty($nueva_password) && $id === getAdminId()) {
            if (strlen($nueva_password) >= (defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8)) {
                $hash = password_hash($nueva_password, PASSWORD_DEFAULT);
                $stmt = $pdo->prepare("UPDATE administradores SET password_hash = ? WHERE id = ? LIMIT 1");
                $stmt->execute([$hash, $id]);
                registrarLog(getEventoId(), 'usuario', 'Actualizar', "Superadmin cambió su contraseña (ID $id)");
                $mensaje = 'Contraseña actualizada.';
            } else {
                $error = 'La contraseña debe tener al menos ' . (defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8) . ' caracteres.';
            }
        }
    } else {
        // Admin puede activar/desactivar y cambiar contraseña (sin contraseña actual)
        $stmt = $pdo->prepare("UPDATE administradores SET activo = ? WHERE id = ? LIMIT 1");
        $stmt->execute([$activo, $id]);
        if (!empty($nueva_password)) {
            if (strlen($nueva_password) >= (defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8)) {
                $hash = password_hash($nueva_password, PASSWORD_DEFAULT);
                $stmt = $pdo->prepare("UPDATE administradores SET password_hash = ? WHERE id = ? LIMIT 1");
                $stmt->execute([$hash, $id]);
            } else {
                $error = 'La contraseña debe tener al menos ' . (defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8) . ' caracteres.';
            }
        }
        if (empty($error)) {
            $detalle = "Usuario ID $id: activo=$activo" . (!empty($nueva_password) ? ', contraseña cambiada' : '');
            registrarLog(getEventoId(), 'usuario', 'Actualizar', $detalle);
            $mensaje = 'Usuario actualizado correctamente.';
        }
    }
}

// Listar usuarios
$tieneRol = false;
try {
    $chk = $pdo->query("SHOW COLUMNS FROM administradores LIKE 'rol'");
    $tieneRol = $chk && $chk->rowCount() > 0;
} catch (Exception $e) { /* ignorar */ }
$sql = "SELECT a.id, a.usuario, a.email, a.nombre, a.activo, a.ultimo_acceso, a.fecha_creacion" . ($tieneRol ? ", a.rol" : "") . "
    FROM administradores a
    ORDER BY " . ($tieneRol ? "a.rol = 'superadmin' DESC, a.rol ASC, " : "") . "a.usuario ASC";
$stmt = $pdo->query($sql);
$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (!$tieneRol) {
    foreach ($usuarios as &$u) { $u['rol'] = ($u['usuario'] === SUPERADMIN_USUARIO ? 'superadmin' : 'gestor'); }
    unset($u);
}
// Solo el superadmin puede ver la fila del superadmin; el resto no ve que existe ese usuario
if (!isSuperAdmin()) {
    $usuarios = array_values(array_filter($usuarios, function ($u) {
        return $u['usuario'] !== SUPERADMIN_USUARIO;
    }));
}

$roles_label = [
    'superadmin' => 'Superadmin',
    'admin'      => 'Admin',
    'gestor'     => 'Gestor',
];
?>
<style>
/* Usuarios: línea gráfica del sistema (admin.css) */
.usuarios-actions { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; margin-bottom: 24px; }
.usuarios-actions .btn { padding: 10px 18px; border-radius: var(--border-radius, 8px); border: none; cursor: pointer; font-size: 14px; font-weight: 500; text-decoration: none; display: inline-block; transition: var(--transition, all 0.2s ease); }
.usuarios-page .btn-primary { background: var(--color-primary, #212529); color: #fff; }
.usuarios-page .btn-primary:hover { background: var(--color-primary-hover, #000); }
/* Mismo estilo que el botón Invitación en invitados: fondo blanco, borde, hover con borde primario */
.usuarios-page .btn-editar {
    background: var(--color-bg-secondary, #fff);
    border: 1px solid var(--color-border, #dee2e6);
    border-radius: var(--border-radius, 8px);
    padding: 8px 12px;
    font-size: 14px;
    color: var(--color-text-primary, #212529);
    transition: var(--transition, all 0.2s ease);
}
.usuarios-page .btn-editar:hover {
    background: var(--color-bg-primary, #f8f9fa);
    border-color: var(--color-primary, #212529);
    color: var(--color-text-primary, #212529);
}
.usuarios-page .btn-danger { background: var(--color-danger, #dc3545); color: #fff; }
.usuarios-page .btn-danger:hover { background: #c82333; }
.usuarios-page .tabla-usuarios .btn { margin-right: 8px; }
/* Dropdown acciones (igual que invitados) */
.usuarios-page .dropdown-acciones { position: relative; display: inline-block; }
.usuarios-page .tabla-usuarios td:last-child { position: relative; }
.usuarios-page .dropdown-btn-acciones {
    position: relative;
    z-index: 0;
    padding: 8px 12px;
    background: var(--color-bg-secondary, #fff);
    border: 1px solid var(--color-border, #dee2e6);
    border-radius: var(--border-radius, 8px);
    color: var(--color-text-primary, #212529);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: var(--transition, all 0.2s ease);
}
.usuarios-page .dropdown-btn-acciones:hover {
    background: var(--color-bg-primary, #f8f9fa);
    border-color: var(--color-primary, #212529);
}
.usuarios-page .dropdown-menu-acciones {
    position: absolute;
    top: calc(100% + 4px);
    right: 0;
    z-index: 100000;
    background: var(--color-bg-secondary, #fff);
    border: 1px solid var(--color-border, #dee2e6);
    border-radius: var(--border-radius, 8px);
    box-shadow: var(--shadow-lg, 0 4px 20px rgba(0,0,0,0.1));
    min-width: 140px;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.15s ease, visibility 0.15s ease;
    overflow: hidden;
}
.usuarios-page .dropdown-menu-acciones.show {
    opacity: 1;
    visibility: visible;
}
.usuarios-page .dropdown-menu-acciones a {
    display: block;
    padding: 10px 16px;
    color: var(--color-text-primary, #212529);
    text-decoration: none;
    font-size: 14px;
    transition: var(--transition);
    border-bottom: 1px solid var(--color-border, #dee2e6);
}
.usuarios-page .dropdown-menu-acciones a:last-child { border-bottom: none; }
.usuarios-page .dropdown-menu-acciones a:hover { background: var(--color-bg-primary, #f8f9fa); }
.usuarios-page .dropdown-menu-acciones a.accion-eliminar { color: var(--color-danger, #dc3545); }
.usuarios-page .dropdown-menu-acciones a.accion-eliminar:hover { background: rgba(220, 53, 69, 0.1); }
.alert { padding: 12px 16px; border-radius: var(--border-radius, 8px); margin-bottom: 20px; }
.alert-success { background: #e8f5e9; color: #2e7d32; border: 1px solid #c8e6c9; }
.alert-error { background: #ffebee; color: #c62828; border: 1px solid #ffcdd2; }
.table-wrap { overflow-x: auto; overflow-y: visible; background: var(--color-bg-secondary, #fff); border-radius: var(--border-radius, 8px); box-shadow: var(--shadow-md, 0 2px 10px rgba(0,0,0,0.08)); }
.table-wrap .tabla-usuarios { position: relative; }
.tabla-usuarios { width: 100%; border-collapse: collapse; }
.tabla-usuarios th, .tabla-usuarios td { padding: 14px 16px; text-align: left; border-bottom: 1px solid var(--color-border, #dee2e6); }
.tabla-usuarios th { background: var(--color-bg-primary, #f8f9fa); font-weight: 600; color: var(--color-text-secondary, #6c757d); }
.tabla-usuarios tr:hover { background: var(--color-bg-primary, #f8f9fa); }
.badge { display: inline-block; padding: 4px 10px; border-radius: 6px; font-size: 12px; font-weight: 500; }
.badge-activo { background: #e8f5e9; color: #2e7d32; }
.badge-inactivo { background: #ffebee; color: #c62828; }
.badge-superadmin { background: var(--color-primary, #212529); color: #fff; }
.badge-admin { background: var(--color-text-primary, #212529); color: #fff; opacity: 0.9; }
.badge-gestor { background: var(--color-border, #dee2e6); color: var(--color-text-secondary, #6c757d); }
.form-modal { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 1000; align-items: center; justify-content: center; padding: 20px; }
.form-modal.show { display: flex; }
.form-modal-inner { background: var(--color-bg-secondary, #fff); border-radius: var(--border-radius, 8px); max-width: 440px; width: 100%; padding: 24px; box-shadow: var(--shadow-lg, 0 4px 20px rgba(0,0,0,0.1)); }
.form-modal h3 { margin: 0 0 20px 0; font-size: 18px; color: var(--color-text-primary, #212529); }
.form-group { margin-bottom: 16px; }
.form-group label { display: block; margin-bottom: 6px; font-weight: 500; color: var(--color-text-secondary, #6c757d); font-size: 14px; }
.form-group input, .form-group select { width: 100%; padding: 10px 12px; border: 1px solid var(--color-border, #dee2e6); border-radius: var(--border-radius, 8px); font-size: 14px; }
.form-actions { margin-top: 20px; display: flex; gap: 10px; justify-content: flex-end; }
.form-actions button, .form-actions .btn { padding: 10px 18px; border-radius: var(--border-radius, 8px); border: none; cursor: pointer; font-size: 14px; font-weight: 500; transition: var(--transition, all 0.2s ease); }
.btn-cancel { background: var(--color-bg-primary, #f8f9fa); color: var(--color-text-primary, #212529); }
.btn-cancel:hover { background: #e9ecef; }
</style>

<div class="usuarios-page">
    <div class="usuarios-actions">
        <h1 style="margin: 0; font-size: 20px;">Gestionar usuarios</h1>
        <button type="button" class="btn btn-primary" onclick="document.getElementById('modal-crear').classList.add('show')">Añadir usuario</button>
    </div>

    <?php if ($mensaje): ?>
    <div class="alert alert-success"><?php echo htmlspecialchars($mensaje); ?></div>
    <?php endif; ?>
    <?php if ($error): ?>
    <div class="alert alert-error"><?php echo htmlspecialchars($error); ?></div>
    <?php endif; ?>

    <div class="table-wrap">
        <table class="tabla-usuarios">
            <thead>
                <tr>
                    <th>Usuario</th>
                    <th>Nombre</th>
                    <th>Email</th>
                    <th>Rol</th>
                    <th>Estado</th>
                    <th>Último acceso</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($usuarios as $u): ?>
                <tr>
                    <td><strong><?php echo htmlspecialchars($u['usuario']); ?></strong></td>
                    <td><?php echo htmlspecialchars($u['nombre']); ?></td>
                    <td><?php echo htmlspecialchars($u['email']); ?></td>
                    <td>
                        <span class="badge badge-<?php echo $u['rol']; ?>"><?php echo $roles_label[$u['rol']] ?? $u['rol']; ?></span>
                    </td>
                    <td>
                        <?php if (isSuperAdminUser($u['usuario'])): ?>
                        <span class="badge badge-activo">Activo (fijo)</span>
                        <?php else: ?>
                        <span class="badge <?php echo $u['activo'] ? 'badge-activo' : 'badge-inactivo'; ?>"><?php echo $u['activo'] ? 'Activo' : 'Inactivo'; ?></span>
                        <?php endif; ?>
                    </td>
                    <td><?php echo $u['ultimo_acceso'] ? date('d/m/Y H:i', strtotime($u['ultimo_acceso'])) : '—'; ?></td>
                    <td>
                        <div class="dropdown-acciones">
                            <button type="button" class="dropdown-btn-acciones" id="btn-acciones-<?php echo (int)$u['id']; ?>" onclick="toggleDropdownUsuarios(<?php echo (int)$u['id']; ?>, this)" aria-label="Acciones">
                                <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2">
                                    <circle cx="8" cy="3" r="1.5"/>
                                    <circle cx="8" cy="8" r="1.5"/>
                                    <circle cx="8" cy="13" r="1.5"/>
                                </svg>
                            </button>
                            <div class="dropdown-menu-acciones" id="dropdown-usuarios-<?php echo (int)$u['id']; ?>">
                                <a href="#" onclick="cerrarDropdownUsuarios(); abrirEditar(<?php echo (int)$u['id']; ?>, '<?php echo htmlspecialchars(addslashes($u['usuario'])); ?>', <?php echo (int)$u['activo']; ?>); return false;">Editar</a>
                                <?php if (isSuperAdmin() && !isSuperAdminUser($u['id'])): ?>
                                <a href="#" class="accion-eliminar" onclick="return confirmarEliminarUsuario(<?php echo (int)$u['id']; ?>)">Eliminar</a>
                                <?php endif; ?>
                            </div>
                        </div>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </div>
</div>

<!-- Form oculto para eliminar (se envía por JS) -->
<form method="post" id="form-eliminar-usuario" style="display: none;">
    <input type="hidden" name="accion" value="eliminar">
    <input type="hidden" name="id" id="form-eliminar-usuario-id">
</form>

<!-- Modal Crear -->
<div id="modal-crear" class="form-modal">
    <div class="form-modal-inner">
        <h3>Añadir usuario</h3>
        <form method="post">
            <input type="hidden" name="accion" value="crear">
            <div class="form-group">
                <label>Usuario (login)</label>
                <input type="text" name="usuario" required minlength="2" maxlength="50" placeholder="Nombre de usuario">
            </div>
            <div class="form-group">
                <label>Contraseña</label>
                <input type="password" name="password" required minlength="<?php echo defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8; ?>" placeholder="Mín. <?php echo defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8; ?> caracteres">
            </div>
            <div class="form-group">
                <label>Email</label>
                <input type="email" name="email" required placeholder="correo@ejemplo.com">
            </div>
            <div class="form-group">
                <label>Nombre</label>
                <input type="text" name="nombre" required maxlength="100" placeholder="Nombre completo">
            </div>
            <div class="form-group">
                <label>Rol</label>
                <select name="rol">
                    <option value="gestor">Gestor</option>
                    <option value="admin">Admin</option>
                </select>
            </div>
            <div class="form-actions">
                <button type="button" class="btn btn-cancel" onclick="document.getElementById('modal-crear').classList.remove('show')">Cancelar</button>
                <button type="submit" class="btn btn-primary">Crear usuario</button>
            </div>
        </form>
    </div>
</div>

<!-- Modal Editar -->
<div id="modal-editar" class="form-modal">
    <div class="form-modal-inner">
        <h3>Editar usuario: <span id="editar-usuario-nombre"></span></h3>
        <form method="post" id="form-editar">
            <input type="hidden" name="accion" value="actualizar">
            <input type="hidden" name="id" id="editar-id">
            <div class="form-group" id="editar-activo-wrap">
                <label><input type="checkbox" name="activo" id="editar-activo" value="1"> Activo</label>
            </div>
            <div class="form-group">
                <label>Nueva contraseña (dejar en blanco para no cambiar)</label>
                <input type="password" name="nueva_password" id="editar-password" placeholder="Mín. <?php echo defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8; ?> caracteres" minlength="<?php echo defined('PASSWORD_MIN_LENGTH') ? PASSWORD_MIN_LENGTH : 8; ?>">
            </div>
            <div class="form-actions">
                <button type="button" class="btn btn-cancel" onclick="document.getElementById('modal-editar').classList.remove('show')">Cancelar</button>
                <button type="submit" class="btn btn-primary">Guardar</button>
            </div>
        </form>
    </div>
</div>

<script>
function abrirEditar(id, usuario, activo) {
    document.getElementById('editar-id').value = id;
    document.getElementById('editar-usuario-nombre').textContent = usuario;
    document.getElementById('editar-activo').checked = !!activo;
    document.getElementById('editar-password').value = '';
    var esSuperadmin = usuario === '<?php echo addslashes(SUPERADMIN_USUARIO); ?>';
    document.getElementById('editar-activo-wrap').style.display = esSuperadmin ? 'none' : 'block';
    document.getElementById('modal-editar').classList.add('show');
}
function toggleDropdownUsuarios(id, btn) {
    var menu = document.getElementById('dropdown-usuarios-' + id);
    if (!menu) return;
    document.querySelectorAll('.usuarios-page .dropdown-menu-acciones').forEach(function(m) {
        if (m !== menu) m.classList.remove('show');
        m.style.position = '';
        m.style.top = '';
        m.style.left = '';
    });
    if (menu.classList.contains('show')) {
        menu.classList.remove('show');
        return;
    }
    menu.classList.add('show');
    if (btn) {
        var rect = btn.getBoundingClientRect();
        var ancho = menu.offsetWidth || 140;
        menu.style.position = 'fixed';
        menu.style.top = (rect.bottom + 4) + 'px';
        menu.style.left = (rect.right - ancho) + 'px';
    }
}
function cerrarDropdownUsuarios() {
    document.querySelectorAll('.usuarios-page .dropdown-menu-acciones').forEach(function(m) {
        m.classList.remove('show');
    });
}
function confirmarEliminarUsuario(id) {
    if (!confirm('¿Eliminar este usuario?')) return false;
    document.getElementById('form-eliminar-usuario-id').value = id;
    document.getElementById('form-eliminar-usuario').submit();
    return false;
}
document.addEventListener('click', function(e) {
    if (!e.target.closest('.usuarios-page .dropdown-acciones')) {
        cerrarDropdownUsuarios();
    }
});
document.getElementById('modal-crear').addEventListener('click', function(e) { if (e.target === this) this.classList.remove('show'); });
document.getElementById('modal-editar').addEventListener('click', function(e) { if (e.target === this) this.classList.remove('show'); });
</script>
