package com.yonge.cooleshow.auth.service;

import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
import com.yonge.cooleshow.auth.api.dto.UserSetReq;
import com.yonge.cooleshow.auth.api.entity.SysUser;
import com.yonge.cooleshow.auth.api.vo.UserSetVo;
import com.yonge.cooleshow.auth.dal.wrapper.LogOffWrapper;
import com.yonge.cooleshow.auth.enums.EClientType;
import com.yonge.cooleshow.common.entity.HttpResponseResult;
import com.yonge.cooleshow.common.entity.ImUserModel;
import com.yonge.toolset.mybatis.service.BaseService;

import java.util.List;

public interface SysUserService extends BaseService<Long, SysUser> {

    /**
     * 根据用户名查询对象
     *
     * @param username
     * @return
     */
    SysUser queryByUsername(String username);

    /**
     * 根据手机号查询对象
     *
     * @param phone
     * @return
     */
    SysUser queryByPhone(String phone);

    /**
     * 根据手机号查询对象
     *
     * @param phone
     * @return
     */
    SysUser queryLockByPhone(String phone);

    /**
     * 根据手机号查询对象
     *
     * @param phone
     * @return
     */
    SysUser queryByPhoneAndClient(String phone, String client);

    /**
     * 根据用户名获取系统用户详细信息
     *
     * @param username
     * @return
     */
    SysUserInfo queryUserInfoByUsername(String username);

    /**
     * 根据手机号获取系统用户详细信息
     *
     * @param phone
     * @return
     */
    SysUserInfo queryUserInfoByPhone(String phone);

    /**
     * 根据手机号获取系统用户详细信息
     *
     * @param phone
     * @return
     */
    SysUserInfo queryUserInfoByPhoneAndClient(String phone, String client);

    /**
     * 根据用户手机号修改密码
     *
     * @param mobile
     * @param password
     */
    void updatePassword(String mobile, String password);

    /**
     * 新增用户
     *
     * @param sysUser
     * @return
     */
    Long add(SysUser sysUser);

    /**
     * 获取用户基本信息
     *
     * @param userId
     * @return
     */
    ImUserModel getBasic(Long userId);

    /**
     * 修改用户基本信息
     *
     * @param sysUser
     */
    void updateBaseInfo(SysUser sysUser);

    /**
     * 获取用户基本信息
     *
     * @param userId
     * @return
     */
    SysUser queryUserInfo(Long userId);

    /**
     * 用户注册
     *
     * @param phone
     * @param clientId
     * @param loginUserType
     * @return
     */
    SysUserInfo registerUser(String phone, String clientId, String loginUserType);

    /**
     * 添加系统客服好友消息
     * @param sysUser SysUser
     * @param clientType 客户端类型
     */
    void sendSysCustomerServiceFriendMessage(SysUser sysUser, String clientType);

    /**
     * 刷新token
     *
     * @param sysUser
     */
    void refreshImToken(SysUser sysUser);

    /**
     * 保存student数据
     *
     * @param userId
     */
    void saveStudent(SysUser sysUser);

    /**
     * 保存teacher数据
     *
     * @param sysUser
     */
    void saveTeacher(SysUser sysUser);

    /***
     * 更新用户实名信息
     * @author liweifan
     * @param: realNameAuthDto
     * @param: idcardInfoExtractor
     * @updateTime 2022/3/22 15:11
     * @return: java.lang.Integer
     */
    void updateUserCard(RealnameAuthReq realNameAuthDto);

    /***
     * 用户设置页面详情
     * @author liweifan
     * @param: id
     * @updateTime 2022/3/22 10:22
     * @return: com.yonge.cooleshow.biz.dal.vo.TeacherVo
     */
    UserSetVo getSetDetail(Long id);

    /***
     * 用户设置
     * @author liweifan
     * @param: setReq
     * @param: id
     * @updateTime 2022/3/22 11:04
     */
    void submitSetDetail(UserSetReq setReq, Long id);

    //修改融云用户基本信息
    void updateRongCloudUserInfo(Long userId, String clientType);

    /**
     * 商城同步管理用户
     *
     * @param queryInfo
     * @return
     */
    List<SysUser> queryEmployeeList(SysUserQueryInfo queryInfo);

    /**
     * 校验二维码
     * @param phone
     * @param qrCode
     * @return
     */
    boolean verifyQrCode(String phone, String qrCode);

    /**
     * 用户注销
     * @param id
     */
    void logoffById(Long id);

    void updateLockStatus(Long userId, Integer lockFlag, String sysUserType);

    /**
     * 用户信息
     * @param userId 用户ID
     * @param clientType 客户端类型
     * @return SysUser
     */
    SysUser queryUserInfoWithIMToken(Long userId, EClientType clientType);

    //根据用户类型获取机构编号
    Long getTenantByClient(Long userId, String clientId);

    /**
     * 根据openId获取用户信息
     * @param openId 用户openId
     * @param clientId 客户端ID
     * @return SysUser
     */
    SysUser getSysUserByOpenId(String openId, String clientId);

    HttpResponseResult<Void> logoffByPhone(String phone);

    HttpResponseResult<List<String>> logoffCheckByPhone(String phone);


    void updateStudentHideFlag(Long userId, int hideFlag);
}