package com.yunzhupaas.permission.service;

import com.yunzhupaas.base.UserInfo;
import com.yunzhupaas.base.entity.SystemEntity;
import com.yunzhupaas.base.model.portalManage.PortalModel;
import com.yunzhupaas.base.model.portalManage.SavePortalAuthModel;
import com.yunzhupaas.base.service.SuperService;
import com.yunzhupaas.database.model.superQuery.SuperJsonModel;
import com.yunzhupaas.model.login.UserSystemVO;
import com.yunzhupaas.permission.entity.AuthorizeEntity;
import com.yunzhupaas.permission.model.authorize.AuthorizeDataUpForm;
import com.yunzhupaas.permission.model.authorize.AuthorizeVO;
import com.yunzhupaas.permission.model.authorize.SaveBatchForm;

import java.util.List;

/**
 * 操作权限
 *
 * @author 云筑产品开发平台组
 * @version V3.1.0
 * @copyright 深圳市乐程软件有限公司
 * @date 2024-09-26 上午9:18
 */
public interface AuthorizeService extends SuperService<AuthorizeEntity> {


    /**
     * 获取权限（菜单、按钮、列表）
     *
     * @param isCache      是否存在redis
     * @param singletonOrg
     * @return
     */
    AuthorizeVO getAuthorize(boolean isCache, boolean singletonOrg);

    /**
     * 获取权限（菜单、按钮、列表）
     *
     * @param isCache      是否存在redis
     * @param singletonOrg
     * @return
     */
    AuthorizeVO getAuthorize(boolean isCache, boolean singletonOrg, boolean isMainSystem);

    /**
     * 创建
     *
     * @param objectId      对象主键
     * @param authorizeList 实体对象
     */
    void save(String objectId, AuthorizeDataUpForm authorizeList);

    /**
     * 创建
     *
     * @param saveBatchForm 对象主键
     */
    void saveBatch(SaveBatchForm saveBatchForm, boolean isBatch);

    /**
     * 根据用户id获取列表
     *
     * @param isAdmin 是否管理员
     * @param userId  用户主键
     * @return
     */
    List<AuthorizeEntity> getListByUserId(boolean isAdmin, String userId);

    /**
     * 根据对象Id获取列表
     *
     * @param objectId 对象主键
     * @return
     */
    List<AuthorizeEntity> getListByObjectId(List<String> objectId);

    /**
     * 判断当前角色是否有权限
     *
     * @param roleId
     * @param systemId
     * @return
     */
    Boolean existAuthorize(String roleId, String systemId);

    /**
     * 判断当前角色是否有权限
     *
     * @param roleId
     * @return
     */
    List<AuthorizeEntity> getListByRoleId(String roleId);

    /**
     * 根据对象Id获取列表
     *
     * @param objectId 对象主键
     * @param itemType 对象主键
     * @return
     */
    List<AuthorizeEntity> getListByObjectId(String objectId, String itemType);

    /**
     * 根据对象Id获取列表
     *
     * @param objectType 对象主键
     * @return
     */
    List<AuthorizeEntity> getListByObjectAndItem(String itemId, String objectType);

    /**
     * 根据对象Id获取列表
     *
     * @param itemId   对象主键
     * @param itemType 对象类型
     * @return
     */
    List<AuthorizeEntity> getListByObjectAndItemIdAndType(String itemId, String itemType);

    void getPortal(List<SystemEntity> systemList, List<PortalModel> portalList, Long dateTime, List<String> collect);

    void saveItemAuth(SavePortalAuthModel portalAuthModel);

    void saveObjectAuth(SavePortalAuthModel portalAuthModel);

    List<SuperJsonModel> getConditionSql(String moduleId);

    /**
     * 通过Item获取权限列表
     *
     * @param itemType
     * @param itemId
     * @return
     */
    List<AuthorizeEntity> getAuthorizeByItem(String itemType, String itemId);

    AuthorizeVO getAuthorizeByUser(boolean singletonOrg);

    AuthorizeVO getMainSystemAuthorize(List<String> moduleIds, List<String> moduleAuthorize, List<String> moduleUrlAddressAuthorize, boolean singletonOrg);

    List<AuthorizeEntity> getListByRoleIdsAndItemType(List<String> roleIds, String itemType);

    List<UserSystemVO> getUserStanding(boolean isLogin, String userId);

    List<UserSystemVO> getUserStanding(boolean isLogin, String userId, String loginDevice);

    AuthorizeVO getAuthorize(UserInfo userInfo, boolean singletonOrg, Integer stand, boolean isMainSystem);

    void removeAuthByUserOrMenu(List<String> userIds, List<String> menuIds);

    /**
     * 获取用户当前身份
     *
     * @param userId 用户id
     * @param standType 身份类型：1-超级管理员，2-管理员，3普通用户
     * @return
     */
    boolean getUserCurrentStanding(String userId, Integer standType);
}

