<?php
session_start();
require_once '../../Controlador/Utilidades/Conexion_BD.php';
require_once '../../Controlador/Utilidades/Auditoria.php';

header('Content-Type: application/json; charset=utf-8');

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    $id_usuario = $_POST['id_usuario'] ?? null;
    $permisos   = $_POST['permisos']   ?? [];

    if (!$id_usuario) {
        echo json_encode([
            'success' => false,
            'message' => 'ID de usuario es obligatorio.'
        ]);
        exit;
    }

    $conn   = new Conexion_BD();
    $mysqli = $conn->getConnection();

    try {
        if (empty($permisos)) {
            // Si no se envían permisos → eliminar todos
            $stmtDel = $mysqli->prepare("DELETE FROM permisos_usuario WHERE id_usuario = ?");
            if (!$stmtDel) {
                throw new Exception("Error al preparar DELETE: " . $mysqli->error);
            }
            $stmtDel->bind_param("i", $id_usuario);
            $stmtDel->execute();
            $stmtDel->close();
        } else {

            // AHORA INCLUYE puede_movimientos
            $stmt = $mysqli->prepare("
                INSERT INTO permisos_usuario 
                    (id_usuario, modulo, 
                     puede_agregar, puede_editar, puede_eliminar, 
                     puede_reportes, puede_movimientos, puede_estado)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)
                ON DUPLICATE KEY UPDATE
                    puede_agregar     = VALUES(puede_agregar),
                    puede_editar      = VALUES(puede_editar),
                    puede_eliminar    = VALUES(puede_eliminar),
                    puede_reportes    = VALUES(puede_reportes),
                    puede_movimientos = VALUES(puede_movimientos),
                    puede_estado      = VALUES(puede_estado)
            ");

            if (!$stmt) {
                throw new Exception("Error al preparar INSERT: " . $mysqli->error);
            }

            $modulos_enviados = [];

            foreach ($permisos as $modulo => $acciones) {
                $modulos_enviados[] = $modulo;

                $puede_agregar     = isset($acciones['agregar'])     ? 1 : 0;
                $puede_editar      = isset($acciones['editar'])      ? 1 : 0;
                $puede_eliminar    = isset($acciones['eliminar'])    ? 1 : 0;
                $puede_reportes    = isset($acciones['reportes'])    ? 1 : 0;
                $puede_movimientos = isset($acciones['movimientos']) ? 1 : 0; // << NUEVO
                $puede_estado      = isset($acciones['estado'])      ? 1 : 0;

                // isiiiiii → 1 int (id), 1 string (modulo), 6 int (tinyint)
                $stmt->bind_param(
                    "isiiiiii",
                    $id_usuario,
                    $modulo,
                    $puede_agregar,
                    $puede_editar,
                    $puede_eliminar,
                    $puede_reportes,
                    $puede_movimientos,
                    $puede_estado
                );

                if (!$stmt->execute()) {
                    throw new Exception("Error al ejecutar consulta para módulo $modulo: " . $stmt->error);
                }
            }

            $stmt->close();

            // Eliminar permisos que no fueron enviados
            if (count($modulos_enviados) > 0) {
                $placeholders = implode(',', array_fill(0, count($modulos_enviados), '?'));
                $types        = str_repeat('s', count($modulos_enviados));
                
                $sql = "
                    DELETE FROM permisos_usuario
                    WHERE id_usuario = ?
                      AND modulo NOT IN ($placeholders)
                ";

                $stmtDel = $mysqli->prepare($sql);
                if (!$stmtDel) {
                    throw new Exception("Error al preparar DELETE de módulos sobrantes: " . $mysqli->error);
                }

                $bindTypes = 'i' . $types;
                $params    = array_merge([$id_usuario], $modulos_enviados);

                $stmtDel->bind_param($bindTypes, ...$params);
                if (!$stmtDel->execute()) {
                    throw new Exception("Error al eliminar permisos sobrantes: " . $stmtDel->error);
                }

                $stmtDel->close();
            }
        }

        // Auditoría
        $id_usuario_editor = $_SESSION['id_usuario'] ?? 0;
        $nombre_editor     = $_SESSION['usuario']   ?? 'sistema';

        if (empty($permisos)) {
            $descripcion = "Se eliminaron todos los permisos del usuario ID: $id_usuario";
        } else {
            $mods        = implode(', ', array_keys($permisos));
            $descripcion = "Se actualizaron los permisos del usuario ID: $id_usuario en los módulos: $mods";
        }

        registrarAuditoria(
            'permisos_usuario',
            'actualizar',
            $descripcion,
            $id_usuario_editor,
            $nombre_editor,
            '',
            'permisos_usuario',
            $id_usuario,
            $_SESSION['rol'] ?? ''
        );

        echo json_encode([
            'success' => true,
            'message' => 'Permisos guardados correctamente.'
        ]);

    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'message' => $e->getMessage()
        ]);
    }

    $mysqli->close();

} else {
    echo json_encode([
        'success' => false,
        'message' => 'Método no permitido.'
    ]);
}
?>
