package com.qmth.teachcloud.common.service;

import com.qmth.teachcloud.common.bean.auth.AuthBean;
import com.qmth.teachcloud.common.bean.result.LoginResult;
import com.qmth.teachcloud.common.bean.result.MenuResult;
import com.qmth.teachcloud.common.entity.SysRolePrivilege;
import com.qmth.teachcloud.common.entity.SysUser;
import com.qmth.teachcloud.common.entity.SysUserRole;
import com.qmth.teachcloud.common.enums.AppSourceEnum;
import com.qmth.teachcloud.common.enums.PrivilegePropertyEnum;
import com.qmth.teachcloud.common.enums.SystemCodeEnum;

import java.io.File;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 公共服务service
 */
public interface TeachcloudCommonService {

    /**
     * 获取用户菜单
     *
     * @param userId 用户ID
     */
    MenuResult getUserMenu(Long userId);

    /**
     * 新增用户权限
     *
     * @param sysUser 用户对象
     * @param roleId  角色ID
     */
    void addUserRolePrivilege(SysUser sysUser, Long roleId);

    /**
     * 新增用户权限
     *
     * @param sysUser 用户对象
     * @param roleIds 角色ID集合
     */
    void addUserRolePrivilege(SysUser sysUser, Long[] roleIds);

    /**
     * 获取要新增的用户权限集合
     *
     * @param sysUser 用户对象
     * @param roleIds 角色ID集合
     */
    List<SysUserRole> disposeUserPrivilege(SysUser sysUser, Long[] roleIds);

    /**
     * 获取用户角色
     *
     * @param userId 用户ID
     */
    List<SysUserRole> getUserRolePrivilege(Long userId);

    /**
     * 获取角色权限
     *
     * @param roleId 角色ID
     */
    List<SysRolePrivilege> getRolePrivilege(Long schoolId, Long roleId);

    /**
     * 获取用户权限
     *
     * @param userId 用户ID
     */
    AuthBean getUserAuth(Long userId);

    /**
     * 获取鉴权url
     *
     * @param privilegePropertyEnum 鉴权属性枚举类
     */
    Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum);

    /**
     * 获取鉴权url
     *
     * @param privilegePropertyEnum 鉴权属性枚举类
     * @param schoolId              学校ID
     */
    Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum, Long schoolId);

    /**
     * 删除用户信息
     *
     * @param userId 用户ID
     * @param all    是否所有平台
     */
    void removeUserInfo(Long userId, boolean all) throws NoSuchAlgorithmException;

    /**
     * 批量删除用户信息
     *
     * @param userIds 用户ID集合
     * @param all     是否所有平台
     */
    void removeUserInfoBatch(List<Long> userIds, boolean all);

    /**
     * 文件预览
     *
     * @param path 文件path
     */
    String filePreview(String path);

    /**
     * 批量文件预览
     *
     * @param path 文件path集合
     */
    List<String> filePreview(List<String> path);

    /**
     * 阅卷图片
     *
     * @param path 文件path
     */
    List<String> fileMarkPreview(List<String> path);

    /**
     * 文件预览
     *
     * @param attachmentId 附件ID
     */
    String filePreview(Long attachmentId);

    /**
     * 文件预览
     *
     * @param path       文件path
     * @param uploadType 上传类型
     * @param type       本地或者oss
     * @param isExpire   是否带过期信息
     */
    String filePreviewByPathAndType(String path, String uploadType, String type, Boolean isExpire);

    /**
     * 文件预览
     *
     * @param attachmentId 附件ID
     * @param isExpire     是否带过期信息
     */
    Map<String, String> filePreviewByAttachmentId(Long attachmentId, Boolean isExpire);

    /**
     * 题卡html文件上传，读取文件内容
     *
     * @param path 文件地址
     */
    String readFileContent(String path);

    /**
     * 获取文件
     *
     * @param path         文件地址
     * @param pdf          是否为pdf文件
     * @param fileTempList 临时文件集合
     */
    File getFile(String path, boolean pdf, List<File> fileTempList) throws Exception;

    /**
     * 根据orgId查询所有子机构ID集合
     *
     * @param orgId 机构ID
     */
    Set<Long> listSubOrgIds(Long orgId);

    /**
     * 登录公用
     *
     * @param password  密码
     * @param sysUser   用户对象
     * @param appSource 来源
     */
    LoginResult login(String password, SysUser sysUser, AppSourceEnum appSource) throws NoSuchAlgorithmException;

    /**
     * /**
     * 根据编码类型获取系统编码
     *
     * @param type        编码类型
     * @param requestUser 请求的用户
     * @return 系统编码
     */
    String getSysIncrCode(SystemCodeEnum type, SysUser requestUser);

    /**
     * 校验用户是否包含某权限
     *
     * @param userId        用户ID
     * @param button        类型
     * @param selectStudent 权限url名称
     */
    boolean containsPrivilege(Long userId, String button, String selectStudent);
}
