package com.sunxung.factoring.service.sys;

import com.sunxung.factoring.entity.GridPage;
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.sys.vo.SysGradationVo;
import com.sunxung.factoring.entity.weekWorkPlan.vo.SearchWeekWorkPlan;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * @className:UserService
 * @description:用户信息service
 * @author:杜小姣
 * @e-mail:1261237207@qq.com
 * @date:2018年1月17日 下午5:07:12
 */
public interface UserService {

    /**
     * 新增用户信息
     *
     * @param user 用户信息实体类
     * @return User 用户信息实体类
     */
    User add(User user);

    /**
     * 新增用户
     *
     * @param user 用户信息实体类
     * @return User 用户信息实体类
     */
    User addUser(User user, HttpServletRequest request);

    /**
     * 修该用户信息
     *
     * @param user 用户信息实体类
     * @return User 用户信息实体类
     */
    User update(User user, HttpServletRequest request);


    /**
     * 修该用户信息
     *
     * @param user 用户信息实体类
     * @return User 用户信息实体类
     */
    void update(User user);

    /**
     * 修改用户部分信息
     *
     * @param user
     * @return
     */
    User updateSimpleUserInfo(User user);

    /**
     * 根据id删除用户信息
     *
     * @param id 用户ID
     * @return boolean true表示删除成功、false表示删除失败
     */
    boolean delete(Long id);

    /**
     * 删除多个用户信息
     *
     * @param ids 用户ID
     * @return boolean true表示删除成功，false表示删除失败
     */
    boolean deletes(String[] ids);

    /**
     * 根据id获取用户信息
     *
     * @param id 用户ID
     * @return User 用户信息实体类
     */
    User get(Long id);

    /**
     * 根据id获取用户信息
     *
     * @param id    用户ID
     * @param orgId 所选的组织机构的ID
     * @return User 用户详情信息实体类
     */
    User getDetail(Long id, Long orgId);

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

    /**
     * 获取所有登录名
     * @return
     */
    List<String> findAllLoginName();

    User validatorLoginName(String loginName, Long userId);

    /**
     * 重置密码【后台重置密码方法】
     *
     * @param user 用户信息实体类
     * @return boolean ture表示成功，false表示失败
     */
    boolean resetPassword(User user);

    /**
     * 修改密码
     *
     * @param id
     * @param password
     * @param oldPassword
     * @param password1
     * @return
     */
    boolean updatePassword(Long id, String password, String oldPassword, String password1);

    /**
     * 禁用、启用用户
     *
     * @param ids     用户ID是string类型的数组，用逗号隔开
     * @param enabled 状态
     * @return boolean
     */
    boolean modifyEnabled(String[] ids, boolean enabled);

    /**
     * 用户列表
     *
     * @param userSeach 用户查询实体类
     * @return GridPage<User>
     */
    GridPage<User> findBySearch(SeachUser userSeach);

    /**
     * 用户管理修改页面多选框预加载
     *
     * @param id
     * @return User
     */
    User getUserRoleRelCheck(Long id);

    /**
     * 根据用户id获取其所有岗位
     *
     * @param id 用户id
     * @return List<UserRoleRel>
     */
    List<UserRoleRel> getUserRoleByUserId(Long id);

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

    /**
     * 获取用户总数量. <br/>
     *
     * @return
     */
    Integer countAllUser();

    /**
     * 查询所有用户 . <br/>
     *
     * @return
     */
    List<User> findByUserAll();

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

    /**
     * 根据组织结构编码分页查询用户. <br/>
     *
     * @param orgCode 组织结构编码
     * @param userid  后台用户id
     * @return
     */
    GridPage<User> findByOrgcode(SearchWeekWorkPlan search);

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

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

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

    /**
     * 新增用户和角色的关系
     *
     * @param userRoleRel 用户角色关系实体类
     */
    void addUserRoleRel(UserRoleRel userRoleRel);

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

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

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

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

    /**
     * 调整部门的顺序
     *
     * @param sysVo 部门顺序封装类
     * @return boolean true成功，false 失败
     */
    boolean adjustOrder(SysGradationVo sysVo);

    /**
     * 调整部门
     *
     * @param user 用户实体
     * @return boolean true成功，false 失败
     */
    boolean adjustDepartment(User user);

    /**
     * 根据组织机构ID，查询用户List集合
     *
     * @param orgId 组织机构的ID
     * @return List<User> 返回用户List的集合
     */
    List<User> getUserList(Long orgId);

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

    /**
     * 根据用户ID获取用户所在所有部门格式为：“长安银科-风险部-风险1部 长安银科-业务部-业务1部”. <br/>
     *
     * @param userId
     * @return
     */
    String getDepartmentByUserId(Long userId);

    /**
     * 根据用户ID查询其直属上级用户ID<br>
     * 1.若用户为某一部门“上级”身份的用户，那么其直属上级为父部门的上级（用户）。<br>
     * 2.由于用户可能拥有多个部门的身份，以及同一部门可能存在多个“上级”（用户），所以 上级存在多个。
     *
     * @param userId 用户ID
     * @return 直属上级身份用户ID的集合
     */
    List<Long> findSuperiorByUserId(Long userId);

    /**
     * 根据部门ID获取部门内“上级”身份的用户ID
     *
     * @param orgId 部门ID
     * @return
     */
    List<Long> findSuperiorByOrgId(Long orgId);

    /**
     * 根据部门ID获取部门内“上级”身份的用户ID，若包含指定的userId，那么获取该部门父部门内的“上级”用户
     *
     * @param orgId  部门ID
     * @param userId 用户ID
     * @return
     */
    List<Long> findSuperiorByOrgIdUserId(Long orgId, Long userId);

    /**
     * 根据用户ID获取其同部门的用户以及所有父部门的用户ID
     *
     * @param userId 当前部门用户ID
     * @return
     */
    List<Long> findCurrentAndParentOrgUserByUserId(Long userId);

    /**
     * 根据用户ID获取其同部门的用户以及所有子部门(下级)的用户ID
     *
     * @param userId 当前部门用户ID
     * @return
     */
    List<Long> findCurrentAndSubOrgUserByUserId(Long userId);

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

    /**
     * 根据部门ID获取部门内“上级”身份的用户信息
     *
     * @param orgId 部门ID
     * @return
     */
    List<User> findDetailSuperiorByOrgId(Long orgId);

    /**
     * 根据用户ID获取关联的部门信息
     *
     * @param userId 用户ID
     * @return
     */
    List<UserOrgRel> findOrgRelByUserId(Long userId);

    /**
     * 根据角色ID查询用户. <br/>
     *
     * @param roleId
     * @return
     */
    List<User> findUserByRoleId(Long roleId);

    /**
     * 获取指定角色名称下所有用户. <br/>
     *
     * @param roleName
     * @return
     */
    List<User> findUserByRoleName(String roleName);

    /**
     * 获取该角色下所有用户的ID
     *
     * @param roleName 角色名称
     * @return 用户ID集合
     */
    List<Long> findUserIdByRole(String roleName);

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

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

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

    /**
     * 查询部门所有人员（去掉已禁用的 去重复）
     *
     * @return
     */
    List<Map<String, Object>> findAll();

    /**
     * 查询所有未禁用的人员的邮箱(去掉实习生)
     *
     * @return
     */
    List<String> findAllEnabledUserEmail();

    /**
     * 根据EnterpriseCustomerId查询
     *
     * @param enterpriseCustomerId
     * @return
     */
    User selectByEnterpriseCustomerId(long enterpriseCustomerId);

    /**
     * 贸理通客户信息管理添加客户账号
     *
     * @param user
     */
    void addCustomerUser(User user);

    /**
     * 修改贸理通账户账号和密码
     *
     * @param user
     */
    void updateCustomerUser(User user);


    /**
     * 根据组织机构Id删除用户组织机构关联信息
     *
     * @param orgId
     */
    void deleteUserOrgRelByOrgId(Long orgId);

    /**
     * 添加用户组织关联信息
     *
     * @param userOrgRel
     */
    void addUserOrgRel(UserOrgRel userOrgRel);

    /**
     * 从sop新增同步
     *
     * @param user
     * @return
     */
    User addBySop(User user);

}
