package com.sckw.system.api;

import com.sckw.core.exception.SystemException;
import com.sckw.core.model.page.PageResult;
import com.sckw.system.api.model.dto.req.*;
import com.sckw.system.api.model.dto.res.*;

import java.util.List;
import java.util.Map;

/**
 * @desc: 用户远程接口
 * @author: czh
 * @date: 2023/6/19
 */
public interface RemoteUserService {

    /**
     * 根据用户名查用户信息
     *
     * @param username 用户账号
     * @return
     */
    KwsUserResDto getUserByAccount(String username);

    /**
     * 根据用户姓名模糊查用户信息
     *
     * @param name 用户姓名
     * @return list
     */
    List<KwsUserResDto> getUserByName(String name);

    /**
     * 根据用户id查用户和机构关联关系
     *
     * @param userId 用户id
     * @return
     */
    List<KwsUserDeptResDto> queryUserDeptByUserId(Long userId);

    /**
     * 根据机构id查机构信息
     *
     * @param ids
     * @return
     */
    List<KwsDeptResDto> queryDeptByIds(List<Long> ids);

    /**
     * @param reqDto 用户注册入参
     * @desc: 用户注册
     * @author: czh
     * @date: 2023/6/19
     */
    void register(RegisterReqDto reqDto) throws SystemException;

    /**
     * 校验密码
     *
     * @param account    入参传的账号
     * @param password   入参传的密码
     * @param currentPwd 当前用户的密码
     * @param salt       当前用户的盐
     */
    void checkPassword(String account, String password, String currentPwd, String salt) throws SystemException;

    /**
     * 检验用户信息
     *
     * @param account
     * @return
     */
    List<KwsUserResDto> checkUserBase(String account, int systemType) throws SystemException;

    /**
     * 根基id查企业
     *
     * @param entId
     * @return
     */
    KwsEnterpriseResDto queryEnterpriseById(Long entId);

    /**
     * @param * @param 用户id
     * @return
     * @desc: 根据用户id查角色
     * @author: czh
     * @date: 2023/6/12
     */
    List<KwsRoleResDto> queryRoleInfoByUserId(Long userId);

    /**
     * @param id 用户id
     * @return 查询用户菜单返参
     * @desc: 根据用户id查拥有的菜单
     * @author: czh
     * @date: 2023/6/13
     */
    List<UserAccessMenuInfoResDto> queryUserAccessMenu(long id);

    /**
     * 查询角色对一个你的菜单
     *
     * @param roleId
     * @return
     */
    List<UserAccessMenuInfoResDto> queryRoleMenu(Long roleId);


    /**
     * @param userLoginReqDto 用户登录信息
     * @desc: 保存用户登录信息
     * @author: czh
     * @date: 2023/6/19
     */
    void saveUserLogin(UserLoginReqDto userLoginReqDto);


    /**
     * @param reqDto 忘记密码入参
     * @desc: 忘记密码
     * @author: czh
     * @date: 2023/6/19
     */
    void forgetPassword(ForgetPasswordReqDto reqDto);

    /**
     * @param userId 用户id
     * @return 登录
     * @desc: 查询用户当天首次登录
     * @author: czh
     * @date: 2023/6/19
     */
    UserLoginReqDto currentDayLogin(long userId);

    /**
     * @param entId 企业id
     * @return EntCertificateResDto
     * @desc: 查资质
     * @author: czh
     * @date: 2023/6/29
     */
    List<EntCertificateResDto> queryCertificateByEntId(Long entId);

    /**
     * @param entId 企业id
     * @return EntCheckTrackResDto
     * @desc: 查企业审批记录
     * @author: czh
     * @date: 2023/6/29
     */
    List<EntCheckTrackResDto> checkTrackByEntId(Long entId);

    /**
     * @param updatePassword 修改密码入参
     * @desc: 修改密码
     * @author: czh
     * @date: 2023/7/3
     */
    void updatePassword(UpdatePasswordReqDto updatePassword);

    /**
     * @param id 用户id
     * @desc: 重置密码
     * @author: czh
     * @date: 2023/7/3
     */
    void resetPassword(Long id);

    /**
     * @param entId 企业id  userId用户id
     * @desc: 设置客户经理
     * @author: czh
     * @date: 2023/7/10
     */
    void bindManager(Long entId, Long userId);

    /**
     * @param ids 主键id
     * @return Map
     * @desc: 根据id查字典
     * @author: czh
     * @date: 2023/7/12
     */
    Map<Long, SysDictResDto> querySysDictByIds(List<Long> ids);

    /**
     * @desc: 校验注册的入参
     * @param: entName 企业名  phone联系电话  systemType系统类型
     * @author: czh
     * @date 2023/7/23
     */
    void checkRegisterParam(String entName, String phone, Integer systemType);

    /**
     * @param entId 企业id
     * @return EntTypeResDto
     * @desc: 根据企业id 查属性
     * @author: czh
     * @date: 2023/7/27
     */
    List<EntTypeResDto> queryEntTypeById(Long entId);

    /**
     * @param cityCode 区域code  entTypeList 企业类型  entIdList 企业id page 页数 pageSize页大小
     * @return PageResult
     * @desc: 根据区域code和企业类型分页查询企业信息
     * @author: czh
     * @date: 2023/9/1
     */
    PageResult queryEntInfoByCityCodeAndEntTypesWithPage(QueryEntInfoByCityCodeAndEntTypesWithPageReqDto reqDto);

    /**
     * @param id 用户id
     * @return List
     * @desc: 根据用户id查数据权限
     * @author: czh
     * @date: 2023/9/4
     */
    List<Long> queryAuthUserList(Long id);

    /**
     * @param entId 企业id
     * @return FindEntUserResDto
     * @desc: 查企业下的员工
     * @author: czh
     * @date: 2023/9/20
     */
    List<FindEntUserResDto> findEntUser(Long entId);

    /**
     * @param code 区域code
     * @desc: 查某区域下的所有区域
     * @author: czh
     * @date: 2023/10/8
     */
    List<AreaTreeFrontResDto> findAllArea(Integer code);

    /**
     * @param firmName 企业名称
     * @param entTypes 企业类型
     * @desc 根据企业名称搜索企业ID（适用于关键字搜索）
     * @author zk
     * @date 2023/10/11
     **/
    List<Long> findEntIds(List<Integer> entTypes, String firmName);

    /**
     * @param entIds   企业ID
     * @param userName 用户名称
     * @desc 根据企业ID或用户名称搜索用户ID（适用于关键字搜索）
     * @author zk
     * @date 2023/10/11
     **/
    List<Long> findUserIds(List<Long> entIds, String userName);


    /**
     * 通过用户id查询所有的企业信息(传递的是客户经理用户的id)
     *
     * @param userId 客户经理id
     * @return list 企业id数组
     */
    List<Long> findEnterpriseIds(Long userId);

    /**
     * 通过用户id查询所有的企业信息(传递的是客户经理用户的id)-判断是不是管理员账户
     *
     * @param userId 客户经理id
     * @return list 企业id数组
     */
    List<Long> findEnterpriseIdsByUserIdIsMain(Long userId);

    /**
     * 通过用户id查询所有的企业信息(传递的是客户经理用户的id)
     *
     * @param userIds 客户经理id
     * @return list 企业id数组
     */
    List<Long> findEnterpriseListByUserIds(List<Long> userIds);

    /**
     * 通过用户id查询所有的企业信息(传递的是客户经理用户的id)
     *
     * @param userIds 客户经理id
     * @return list 企业id数组
     */
    List<Long> findEnterpriseListByIds(List<Long> userIds);

    /**
     * 通过账号类型查出相关所有的企业账户
     *
     * @param systemType
     * @return
     */
    List<Long> selectUserBySystemType(Integer systemType);

    List<Long> findAllEnterprise();

    List<Long> findChildEntList(Long entId);

    List<Long> findEntListByUserId(Long userId);

    void saveUser(KwsUserReqDto kwsUser);
}
