package com.sunxung.factoring.mapper.sys;

import com.sunxung.factoring.entity.sys.User;
import com.sunxung.factoring.entity.sys.UserOrgRel;
import com.sunxung.factoring.entity.sys.UserRoleRel;
import com.sunxung.factoring.entity.sys.vo.SeachUser;
import com.sunxung.factoring.entity.weekWorkPlan.vo.SearchWeekWorkPlan;
import com.sunxung.factoring.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 新增用户角色关系
     *
     * @param userRoleRel
     */
    void addUserRoleRel(UserRoleRel userRoleRel);

    /**
     * 根据登录名获取用户信息
     *
     * @param loginName 用户登录名
     * @return User 用户信息
     */
    User getByLoginName(String loginName);

    List<String> findAllLoginName();

    /**
     * 修改的时候，验证登录名是否唯一
     *
     * @param loginName 登录名
     * @param userId 用户ID
     * @return User
     */
    User validatorByLoginNameForUpdate(@Param("loginName") String loginName, @Param("userId") Long userId);

    /**
     * 重置用户密码
     *
     * @param
     * @param id 用户id
     * @param password 密码
     * @return Integer
     */
    Integer resetPassword(@Param("id") Long id, @Param("password") String password);

    /**
     * 禁用/启用用户
     *
     * @param id 用户id
     * @param enabled 禁用、启用的状态
     * @return Integer
     */
    Integer modifyLock(@Param("id") Long id, @Param("enabled") boolean enabled);

    /**
     * 删除用户角色关系
     *
     * @param id
     * @return Integer
     */
    Integer deleteUserRoleRel(Long id);

    /**
     * 获取用户的所有角色
     *
     * @param
     * @param id
     * @return List<UserRoleRel>
     */
    List<UserRoleRel> getUserRoleByUserId(Long id);

    /**
     * 密码查询（业务层老旧密码相似查询比较）
     *
     * @param id 用户ID
     * @return String 密码
     */
    String getUserPasswordSimilar(Long id);

    /**
     * 判断该用户是否是此角色的管理员. <br/>
     *
     * @param roleId 角色ID
     * @param userId 用户ID
     * @return
     */
    Boolean isRoleAdmin(@Param("roleId") Long roleId, @Param("userId") Long userId);

    /**
     * 新增用户部门关系表
     *
     * @param userId 用户ID
     * @param orgId 部门ID
     * @param orgCode 部门code
     * @param userIdentity 部门用户身份
     */
    void addUserOrgRel(@Param("userId") Long userId, @Param("orgId") Long orgId, @Param("orgCode") String orgCode,
            @Param("userIdentity") boolean userIdentity, @Param("gradation") Integer gradation);

    /**
     * 根据用户ID，查询用户所在的所有的组织机构
     *
     * @param userId 用户id
     * @return
     */
    List<UserOrgRel> getOrgRelByUserId(@Param("userId") Long userId);

    /**
     * 根据组织结构编码查询用户. <br/>
     *
     * @param search
     * @return
     */
    List<User> findByOrgcode(SearchWeekWorkPlan search);

    /**
     * 统计根据组织结构编码查询用户的条数. <br/>
     *
     * @param search
     * @return
     */
    Integer countByOrgcode(SearchWeekWorkPlan search);

    /**
     *  根据用户ID删除用户和组织机构的关系表
     *
     * @param userId 用户ID
     * @return int
     */
    int deleteUserOrgRel(@Param("userId") Long userId);

    /**
     *  根据组织机构ID删除用户和组织机构的关系表
     *
     * @param orgId 组织机构ID
     * @return int
     */
    int deleteUserOrgRelByOrgId(Long orgId);

    /**
     * 根据组织机构的Code查询，该组织机构下一共有多少个员工
     *
     * @param orgCode 组织机构code
     * @return Integer 返回该组织机构下的员工数量
     */
    Integer countUserOrgRelByOrgCode(@Param("orgCode") String orgCode);

    /**
     * 根据角色ID，验证只能有一个超级管理员的角色
     *
     * @param roleId 角色ID
     * @param userId 用户ID
     * @return UserRoleRel
     */
    UserRoleRel getRoleRelByRoleId(@Param("roleId") Long roleId, @Param("userId") Long userId);

    /**
     * 根据角色ID，查询该角色下的所有用户的信息
     *
     * @param SeachUser
     * @return List<User> 返回用户数量
     */
    List<User> findByRoleId(SeachUser SeachUser);

    /**
     * 根据用户ID和组织机构ID查询用户组织机构关联表数据. <br/>
     *
     * @param userId
     * @param orgId
     * @return
     */
    UserOrgRel getByUserIdAndOrgId(@Param("userId") Long userId, @Param("orgId") Long orgId);

    /**
     * 根据钉钉用户ID查询用户信息. <br/>
     *
     * @param userId
     * @return
     */
    User getByDingdingUserId(String userId);

    /**
     * 调整成员的顺序
     *
     * @param userId 用户ID
     * @param gradation 顺序
     * @return int
     */
    int adjustOrder(@Param("orgId") Long orgId, @Param("gradation") int gradation, @Param("userId") Long userId);

    /**
     * 根据名称模糊搜索用户
     *
     * @param keyword 搜索的关键字
     * @return List<User> 返回用户列表的List
     */
    List<User> findList(@Param("keyword") String keyword);

    /**
     * 获取当前部门下面最大的排序数字. <br/>
     *
     * @param orgId
     * @return
     */
    Integer getMaxGradationByOrgId(@Param("orgId") Long orgId);

    /**
     * 根据用户ID查询用户的身份
     *
     * @param userId 用户ID
     * @return UserOrgRel
     */
    List<UserOrgRel> getUserOrgRelByUserId(@Param("userId") Long userId);

    /**
     * 根据条件查询用户组织机构身份信息
     *
     * @param userId 用户ID
     * @param orgId 组织机构ID
     * @return
     */
    List<UserOrgRel> findUserOrgRel(@Param("userId") Long userId, @Param("orgId") Long orgId);

    /**
     * 获取该组织机构下所有用户的ID
     *
     * @param orgId 组织机构ID
     * @return
     */
    List<Long> findUserIdByOrgId(Long orgId);

    /**
     * 获取该角色下所有用户的ID，要求按照序号升序排列，因为经常获取某角色中第一个用户
     *
     * @param roleId 角色ID
     * @return 用户ID集合
     */
    List<Long> findUserIdByRoleId(Long roleId);

    /**
     * 根据组织结构编码查询用户所在部门及子部门的可见人员. <br/>
     *
     * @return
     */
    List<Long> findViewByOrgCode(SearchWeekWorkPlan search);

    /**
     * 根据用户名获取用户信息
     *
     * @param
     * @param name
     * @return User
     */
    User getByName(String name);


    List<User> getListByName(String name);

    /**
     * 根据部门层级、部门顺序、人员顺序排序
     *
     * @param search
     * @return
     */
    List<User> orderUserByOrgGradation(SearchWeekWorkPlan search);

    /**
     * 查询所有未禁用的用户列表
     *
     * @return
     */
    List<String> findAllEnabledUserEmail();

    /**
     * 根据企业客户信息表ID查询用户
     * @param id
     * @return
     */
    User selectByEnterpriseCustomerId(long id);

    /*
    * 根据核心企业ID获取用户信息
    *
    * */
    List<User> getUserByEnterpriseCustomerId(long id);
}
