package com.microservices.system.api;

import com.microservices.common.core.constant.SecurityConstants;
import com.microservices.common.core.constant.ServiceNameConstants;
import com.microservices.common.core.domain.R;
import com.microservices.system.api.domain.SysDept;
import com.microservices.system.api.domain.SysUserDeptRole;
import com.microservices.system.api.factory.RemoteDeptFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 部门服务
 *
 * @author otto
 */
@FeignClient(contextId = "remoteDeptService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteDeptFallbackFactory.class)
public interface RemoteDeptService {
    /**
     * 通过部门Id列表查询部门列表
     *
     * @param ids    部门Id列表
     * @param source 请求来源
     * @return 结果
     */
    @GetMapping("/dept/listInIds/{ids}")
    public R<List<SysDept>> getDeptInDeptIds(@PathVariable("ids") List<Long> ids,
                                             @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过部门Id查询部门信息
     *
     * @param deptId 部门Id
     * @return 结果
     */
    @GetMapping("/dept/getDeptByDeptId/{deptId}")
    public R<SysDept> getDeptByDeptId(@PathVariable("deptId") Long deptId,
                                      @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据专区名称创建部门
     *
     * @param zoneName 专区名称
     * @param source   请求来源
     * @return 部门Id
     */
    @PostMapping("/dept/addDeptByZone")
    public R<Long> addDeptByZone(@RequestBody String zoneName
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过部门Id获取自身及子部门Id列表
     *
     * @param deptId 部门Id
     * @return 自身及子部门Id列表
     */
    @GetMapping("/dept/getSelfAndChildrenDeptIdListByDeptId/{deptId}")
    public R<List<Long>> getSelfAndChildrenDeptIdListByDeptId(@PathVariable("deptId") Long deptId,
                                                              @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据企业名称创建部门
     *
     * @param pmsEnterpriseName 企业名称
     * @param source            请求来源
     * @return 部门Id
     */
    @PostMapping("/dept/addDeptByPmsEnterprise")
    public R<Long> addDeptByPmsEnterprise(@RequestBody String pmsEnterpriseName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据部门Id更新部门名称
     *
     * @param deptId   部门id
     * @param deptName 部门名称
     * @param source   请求来源
     * @return 部门Id
     */
    @PostMapping("/dept/updateDeptNameByDeptId/{deptId}")
    public R<Boolean> updateDeptNameByDeptId(@PathVariable("deptId") Long deptId, @RequestBody String deptName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据组织id删除部门
     *
     * @param deptId 部门id
     * @param source            请求来源
     * @return 是否删除成功
     */
    @DeleteMapping("/dept/deleteDeptByDeptId")
    public R<Boolean> deleteDeptByDeptId(@RequestBody Long deptId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据企业名称删除部门
     *
     * @param pmsEnterpriseName 企业名称
     * @param source            请求来源
     * @return 部门Id
     */
    @DeleteMapping("/dept/deleteDeptByPmsEnterprise")
    public R<Boolean> deleteDeptByPmsEnterprise(@RequestBody String pmsEnterpriseName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过用户名查询用户下组织及组织对应角色列表
     *
     * @param deptId 组织ID
     * @param source   请求来源
     * @return 用户下组织及组织对应角色列表
     */
    @GetMapping("/SysUserDeptRole/userByDeptId/{deptId}/list")
    public R<List<SysUserDeptRole>> getSysUserDeptRoleListByDeptId(@PathVariable("deptId") Long deptId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 查询组织编号下拥有传入角色权限字符串的用户名
     *
     * @param deptId 组织编号
     * @param roleKeys 角色权限字符串
     * @return 组织下拥有传入角色权限字符串的用户名列表
     */
    @GetMapping("/dept/getGitLinkUserNamesByDeptIdAndRoleKeys/{deptId}/list")
    R<List<String>> getGitLinkUserNamesByDeptIdAndRoleKeys(@PathVariable("deptId") Long deptId, @RequestParam("roleKeys") String roleKeys, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 检查用户是否在指定部门下具有指定角色
     *
     * @param currentDeptId 组织编号
     * @param roleKey 角色权限字符串
     * @return 组织下拥有传入角色权限字符串的用户名列表
     */
    @GetMapping("/SysUserDeptRole/checkUserInDeptHasRole")
    R<Boolean> checkUserInDeptHasRole(@RequestParam("currentDeptId") Long currentDeptId, @RequestParam("userId") Long userId, @RequestParam("roleKey") String roleKey, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 检查用户是否在指定部门下具有指定菜单权限
     *
     * @param currentDeptId 组织id
     * @param userId        用户id
     * @param perms         菜单权限
     * @return 用户是否在指定部门下具有菜单权限 是true 否false
     */
    @GetMapping("/SysUserDeptRole/checkUserInDeptHasPerms")
    R<Boolean> checkUserInDeptHasPerms(@RequestParam("currentDeptId") Long currentDeptId, @RequestParam("userId") Long userId, @RequestParam("perms") String perms, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 检查用户是否在指定部门下
     *
     * @param currentDeptId 组织id
     * @param userId        用户id
     * @return 用户是否在指定部门下是true 否false
     */
    @GetMapping("/SysUserDeptRole/checkUserInDept")
    R<Boolean> checkUserInDept(@RequestParam("currentDeptId") Long currentDeptId, @RequestParam("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
