package com.qmth.teachcloud.common.service;

import com.qmth.teachcloud.common.bean.auth.AuthBean;
import com.qmth.teachcloud.common.bean.dto.PrivilegeCacheDto;
import com.qmth.teachcloud.common.bean.result.LoginResult;
import com.qmth.teachcloud.common.bean.result.MenuResult;
import com.qmth.teachcloud.common.bean.result.RolePrivilegeResult;
import com.qmth.teachcloud.common.entity.BasicAttachment;
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 javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Description: 公共服务service
 * @Param:
 * @return:
 * @Author: wangliang
 * @Date: 2021/3/26
 */
public interface TeachcloudCommonService {

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

    /**
     * 新增用户权限
     *
     * @param sysUser
     * @param roleId
     */
    public void addUserRolePrivilege(SysUser sysUser, Long roleId);

    /**
     * 新增用户权限
     *
     * @param sysUser
     * @param roleIds
     */
    public void addUserRolePrivilege(SysUser sysUser, Long[] roleIds);

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

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

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

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

    /**
     * 获取鉴权url
     *
     * @param privilegePropertyEnum
     * @return
     */
    public Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum);

    /**
     * 获取鉴权url
     *
     * @param privilegePropertyEnum
     * @param schoolId
     * @return
     */
    public Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum, Long schoolId);

    /**
     * 给学校赋予权限的公共方法（权限是否启用跟学校联动）
     *
     * @param schoolIdSet 所有学校主键set
     */
    public void addSchoolPrivilege(Set<Long> schoolIdSet);

    /**
     * 删除用户信息
     *
     * @param userId
     * @param all
     */
    public void removeUserInfo(Long userId, boolean all) throws NoSuchAlgorithmException;

    /**
     * 批量删除用户信息
     *
     * @param userIds
     * @param all
     */
    public void removeUserInfoBatch(List<Long> userIds, boolean all);

    /**
     * 修改角色状态
     *
     * @param roleIds
     * @param enable
     */
    public void updateRoleEnable(Long[] roleIds, Boolean enable);

    /**
     * 查询用户或角色权限信息
     *
     * @param privilegeCacheDtoList
     * @return
     */
    public RolePrivilegeResult getUserOrRolePrivilege(List<PrivilegeCacheDto> privilegeCacheDtoList);

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

    /**
     * 文件预览
     *
     * @param path
     * @return
     */
    public String filePreviewByPathAndType(String path, String type, Boolean isExpire);

    /**
     * 文件预览
     *
     * @param attachmentId
     * @return
     */
    public Map<String, String> filePreviewByAttachmentId(Long attachmentId, Boolean isExpire);

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

    /**
     * 获取文件流
     *
     * @param path
     * @param pdf
     * @return
     */
    public InputStream getFileInputStream(String path, boolean pdf) throws Exception;

    /**
     * 获取文件byte数据
     *
     * @param path
     * @param pdf
     * @return
     */
    public byte[] getFileByte(String path, boolean pdf) throws Exception;

    /**
     * 获取文件
     *
     * @param path
     * @param pdf
     * @return
     */
    public File getFile(String path, boolean pdf) throws Exception;

    /**
     * 下载文件到本地
     *
     * @param rootPath   保存目录
     * @param attachment 附件表对象
     * @return
     */
    public File copyFile(String rootPath, String fileName, BasicAttachment attachment) throws Exception;

    /**
     * 下载文件到本地并压缩返回
     *
     * @param filePath 文件根目录
     * @param files    需要下载的文件集合
     */
    public void downloadFileAndZip(HttpServletResponse response, String filePath, List<File> files);

    /**
     * 下载文件到本地并压缩返回
     *
     * @param filePath 文件根目录
     * @param time     zip文件名（时间戳）
     */
    public void downloadFileAndZip(HttpServletResponse response, String filePath, long time);

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

    /**
     * 登录公用
     *
     * @param password
     * @param sysUser
     * @param appSource
     * @return
     */
    public LoginResult login(String password, SysUser sysUser, AppSourceEnum appSource) throws NoSuchAlgorithmException;

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