<?php
class Permiso
{
    public $id;
    public $tipoContenedor;
    public $contenedor;
    public $idTipoAsignacion;
    public $tipoAsignacion;
    public $idAsignacion;
    public $asignacion;
    public $idTipoPermiso;
    public $tipoPermiso;
    public $fechaRegistro;

    public function __construct()
    {
        !empty($this->fechaRegistro) && $this->fechaRegistro = date('d-m-Y h:i a', strtotime($this->fechaRegistro));
    }

    public static function validarTipoAcceso($usuarioActual = null, $idPagina = 0): object
    {
        if (empty($usuarioActual)) $usuarioActual = App::obtenerIdUsuario();

        $db = obtenerConexion();

        $respuesta = null;
        $esRoot = null;
        $tipoPermiso = null;
        $mantenimiento = null;
        $esAdministrativo = null;

        $query = "EXEC sistema.sp_validarPermiso :usuario,:idPagina,:respuesta,:esRoot,:tipoPermiso,:mantenimiento,:esAdministrativo;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':usuario', $usuarioActual, PDO::PARAM_INT);
        $stmt->bindParam(':idPagina', $idPagina, PDO::PARAM_INT);
        $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
        $stmt->bindParam(':esRoot', $esRoot, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);
        $stmt->bindParam(':tipoPermiso', $tipoPermiso, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
        $stmt->bindParam(':mantenimiento', $mantenimiento, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);
        $stmt->bindParam(':esAdministrativo', $esAdministrativo, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);

        try {
            $stmt->execute();
            $esRoot = $esRoot !== 0;
            $esAdministrativo = $esAdministrativo !== 0;
            $permitirVisualizacion = in_array($tipoPermiso, ['LECTURA', 'ESCRITURA', 'ADMINISTRADOR']);

            return (object)[
                'status' => 200,
                'message' => 'success',
                'esRoot' => $esRoot,
                'esAdministrativo' => $esAdministrativo,
                'permitirVisualizacion' => $permitirVisualizacion,
                'mantenimiento' => $mantenimiento,
                'tipoPermiso' => $tipoPermiso,
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function obtenerPorContenedor($tipoContenedor, $contenedor): object
    {
        $db = obtenerConexion();

        $query = "SELECT * FROM sistema.view_permisos WHERE tipoContenedor = :tipoContenedor AND contenedor = :contenedor AND estado = 1;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':tipoContenedor', $tipoContenedor, PDO::PARAM_STR);
        $stmt->bindParam(':contenedor', $contenedor, PDO::PARAM_INT);

        try {
            $stmt->execute();
            $permisos = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);
            return (object)[
                'status' => 200,
                'message' => 'success',
                'data' => $permisos
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public function guardar($usuario): object
    {
        $db = obtenerConexion();

        $respuesta = null;
        $id = null;

        $query = "EXEC sistema.sp_guardarPermiso :id,:tipoContenedor,:contenedor,:tipoAsignacion,:asignacion,:tipoPermiso,:usuario,:respuesta,:idPermiso;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
        $stmt->bindParam(':tipoContenedor', $this->tipoContenedor, PDO::PARAM_STR);
        $stmt->bindParam(':contenedor', $this->contenedor, PDO::PARAM_INT);
        $stmt->bindParam(':tipoAsignacion', $this->idTipoAsignacion, PDO::PARAM_STR);
        $stmt->bindParam(':asignacion', $this->idAsignacion, PDO::PARAM_INT);
        $stmt->bindParam(':tipoPermiso', $this->idTipoPermiso, PDO::PARAM_STR);
        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
        $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
        $stmt->bindParam(':idPermiso', $id, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);

        try {
            $stmt->execute();
            $this->id = $id;
            return (object)[
                'status' => 200,
                'message' => $respuesta,
                'id' => $id
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public function eliminar($usuario): object
    {
        $db = obtenerConexion();

        $respuesta = null;

        $query = "EXEC sistema.sp_eliminarPermiso :id,:responsable,:respuesta;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
        $stmt->bindParam(':responsable', $usuario, PDO::PARAM_INT);
        $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

        try {
            $stmt->execute();
            return (object)[
                'status' => 200,
                'message' => 'success',
                'data' => $respuesta
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }
}
