<?php

require_once "conexion.php";

class ModeloPermiso{

    static public function mdlMostrarPermiso($tabla, $item, $valor){
    if ($item != null) {
        $stmt = Conexion::conectar()->prepare("SELECT rp.rol_id, rp.permiso_id, p.modulo_id, p.accion_id
            FROM $tabla rp
            INNER JOIN permiso p ON rp.permiso_id = p.id
            WHERE rp.$item = :$item AND p.activo = 1
        ");
        $stmt->bindParam(":".$item, $valor, PDO::PARAM_INT);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        $stmt = Conexion::conectar()->prepare("SELECT * FROM permiso WHERE activo = 1
        ");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

// Inserta si no existe, actualiza si ya existe
static public function mdlUpsertPermiso($moduloId, $accionId, $activo){
    $db = Conexion::conectar();

    // Verificar si ya existe
    $stmt = $db->prepare("
        SELECT id FROM permiso 
        WHERE modulo_id = :modulo AND accion_id = :accion
        LIMIT 1
    ");
    $stmt->bindParam(":modulo", $moduloId, PDO::PARAM_INT);
    $stmt->bindParam(":accion", $accionId, PDO::PARAM_INT);
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($row) {
        // Actualizar estado
        $stmt = $db->prepare("
            UPDATE permiso SET activo = :activo 
            WHERE id = :id
        ");
        $stmt->bindParam(":activo", $activo, PDO::PARAM_INT);
        $stmt->bindParam(":id", $row['id'], PDO::PARAM_INT);
        return $stmt->execute();
    } else {
        // Insertar nuevo
        $stmt = $db->prepare("
            INSERT INTO permiso (modulo_id, accion_id, activo) 
            VALUES (:modulo, :accion, :activo)
        ");
        $stmt->bindParam(":modulo", $moduloId, PDO::PARAM_INT);
        $stmt->bindParam(":accion", $accionId, PDO::PARAM_INT);
        $stmt->bindParam(":activo", $activo, PDO::PARAM_INT);
        return $stmt->execute();
    }
}


     // Guardar permisos por rol
    static public function mdlGuardarPermisosPorRol($idRol, $permisosSeleccionados){
        $db = Conexion::conectar();

        try {
            $db->beginTransaction();

            // 1. Eliminar permisos previos del rol
            $del = $db->prepare("DELETE FROM rol_permiso WHERE rol_id = :rol_id");
            $del->bindParam(":rol_id", $idRol, PDO::PARAM_INT);
            $del->execute();

            // 2. Insertar nuevos permisos
            $ins = $db->prepare("INSERT INTO rol_permiso (rol_id, permiso_id) VALUES (:rol_id, :permiso_id)");

            foreach ($permisosSeleccionados as $valor) {

                // Caso A: ya viene permiso_id directo
                if (ctype_digit((string)$valor)) {
                    $permisoId = (int)$valor;

                // Caso B: viene "modulo-accion" → resolver a permiso_id
                } elseif (strpos($valor, '-') !== false) {
                    list($moduloId, $accionId) = explode('-', $valor, 2);

                    $stmt = $db->prepare("SELECT id FROM permiso WHERE modulo_id = :modulo_id AND accion_id = :accion_id LIMIT 1");
                    $stmt->bindParam(":modulo_id", $moduloId, PDO::PARAM_INT);
                    $stmt->bindParam(":accion_id", $accionId, PDO::PARAM_INT);
                    $stmt->execute();
                    $row = $stmt->fetch(PDO::FETCH_ASSOC);

                    if ($row) {
                        $permisoId = (int)$row['id'];
                    } else {
                        continue; // si no existe, lo ignoramos
                    }
                } else {
                    continue; // valor inválido
                }

                $ins->bindParam(":rol_id", $idRol, PDO::PARAM_INT);
                $ins->bindParam(":permiso_id", $permisoId, PDO::PARAM_INT);
                $ins->execute();
            }

            $db->commit();
            return "ok";

        } catch (Exception $e) {
            $db->rollBack();
            return "error: ".$e->getMessage();
        }

    }

    static public function mdlAccionesPorModulo($moduloId){
        $db = Conexion::conectar();
        $stmt = $db->prepare("
            SELECT a.id, a.nombre, p.id AS permiso_id
            FROM permiso p
            INNER JOIN accion a ON a.id = p.accion_id
            WHERE p.modulo_id = :modulo_id AND p.activo = 1
        ");
        $stmt->bindParam(":modulo_id", $moduloId, PDO::PARAM_INT);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    // Resolver modulo-accion a permiso_id
    static public function mdlObtenerPermisoIdPorModuloAccion($moduloId, $accionId){
        $db = Conexion::conectar();
        $stmt = $db->prepare("
            SELECT id 
            FROM permiso 
            WHERE modulo_id = :modulo_id AND accion_id = :accion_id
            LIMIT 1
        ");
        $stmt->bindParam(":modulo_id", $moduloId, PDO::PARAM_INT);
        $stmt->bindParam(":accion_id", $accionId, PDO::PARAM_INT);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row ? (int)$row['id'] : null;
    }

     // Devuelve todas las acciones definidas en la tabla acciones
    static public function mdlObtenerTodasAcciones(){
        $stmt = Conexion::conectar()->prepare("
            SELECT id, nombre 
            FROM accion
            ORDER BY id ASC
        ");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }





}
