package com.qmth.sop.business.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.sop.business.bean.dto.DataPermissionDto;
import com.qmth.sop.business.bean.dto.FormWidgetDto;
import com.qmth.sop.business.bean.dto.OrgUserNameDto;
import com.qmth.sop.business.bean.dto.UserDto;
import com.qmth.sop.business.bean.result.*;
import com.qmth.sop.business.entity.SysUser;
import com.qmth.sop.business.sync.been.rtzf.RtzfResult;
import com.qmth.sop.business.sync.been.rtzf.RtzfUserInfo;
import com.qmth.sop.common.enums.*;

import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author wangliang
 * @since 2023-07-17
 */
public interface SysUserService extends IService<SysUser> {

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

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

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

    /**
     * 根据机构id查询用户
     *
     * @param orgId
     * @return
     */
    List<SysUserResult> findSysUserResultList(Long orgId);

    /**
     * 强行过期用户手机号验证码（过期时间改为验证码发送时间）
     *
     * @param userId       用户id
     * @param mobileNumber 用户手机号
     */
    void expiredVerifyCode(Long userId, String mobileNumber);

    /**
     * 校验短信验证码
     *
     * @param userId       用户id
     * @param mobileNumber 用户手机号
     * @param code         验证码
     */
    void checkSmsCode(Long userId, String mobileNumber, String code);

    /**
     * 查询用户
     *
     * @param iPage
     * @param userInfo
     * @param orgId
     * @param roleId
     * @param enable
     * @return
     */
    IPage<UserDto> query(IPage<Map> iPage, String userInfo, Long orgId, Long roleId, Boolean enable);

    /**
     * 根据用户来源查找用户并返回动态表单数据
     *
     * @param userSourceEnum
     * @return
     */
    List<FormWidgetDto> queryUser(UserSourceEnum userSourceEnum);

    /**
     * 新增/修改用户
     *
     * @param sysUser
     * @param requestUser
     * @return
     */
    Boolean saveUser(SysUser sysUser, SysUser requestUser);

    /**
     * 启用/禁用用户
     *
     * @param sysUser
     * @return
     */
    Boolean enable(SysUser sysUser) throws NoSuchAlgorithmException;

    List<SysUser> listEnable();

    /**
     * 查找用户角色名
     *
     * @param userIds
     * @return
     */
    List<UserRoleNameResult> selectRoleNames(List<Long> userIds);

    /**
     * 修改用户密码
     *
     * @param sysUser
     * @return
     */
    Boolean updatePassword(SysUser sysUser) throws NoSuchAlgorithmException;

    /**
     * 初始化用户密码
     *
     * @param sysUser
     * @return
     */
    Boolean initPassword(SysUser sysUser) throws NoSuchAlgorithmException;

    /**
     * 获取工作台待办
     *
     * @param iPage
     * @param userId
     * @param type
     * @param serviceId
     * @param customName
     * @param flowTaskTypeEnum
     * @param crmNo
     * @return
     */
    IPage<WorkTaskResult> getFlowTaskList(IPage<Map> iPage, Long userId, TFCustomTypeEnum type, Long serviceId, String customName, FlowTaskTypeEnum flowTaskTypeEnum, String crmNo);

    /**
     * 获取工作台待办
     *
     * @param userId
     * @param type
     * @param serviceId
     * @param customName
     * @param flowTaskTypeEnum
     * @param crmNo
     * @return
     */
    int getFlowTaskListCount(Long userId, TFCustomTypeEnum type, Long serviceId, String customName, FlowTaskTypeEnum flowTaskTypeEnum, String crmNo);

    /**
     * 根据角色类型查询用户
     *
     * @param roleType 角色类型
     * @return 用户集合
     */
    List<SysUserBriefResult> findUserListByRoleType(RoleTypeEnum roleType);

    /**
     * 构建用户数据权限
     *
     * @param userId 用户id
     * @return 用户数据权限
     */
    DataPermissionDto buildUserDataPermission(Long userId);

    /**
     * 根据用户id查找用户名(机构)
     *
     * @param userIds
     * @return
     */
    List<OrgUserNameDto> findOrgUserName(List<Long> userIds);

    /**
     * 根据用户id查询用户所在公司名称
     *
     * @param userId 用户id
     * @return 公司名称
     */
    String findUserCompanyName(Long userId);

    /**
     * 软通智服更新用户
     * @param requestUser 请求的用户
     * @param willUpdateUser 将要更新的用户
     * @return 更新结果
     */
    RtzfResult rtzfUpdateUser(SysUser requestUser, SysUser willUpdateUser);
}
