package com.njcn.user.api;

import cn.hutool.core.lang.tree.Tree;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.constant.ServerInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.user.api.fallback.DeptFeignClientFallbackFactory;
import com.njcn.user.pojo.dto.DeptDTO;
import com.njcn.user.pojo.po.Dept;
import com.njcn.user.pojo.vo.PvTerminalTreeVO;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * @author denghuajun
 * @date 2022/1/11
 * 部门相关业务对外接口
 */
@FeignClient(value = ServerInfo.USER,
//        url = "http://127.0.0.1:10201",
        path = "/dept", fallbackFactory = DeptFeignClientFallbackFactory.class,
        contextId = "dept"
)
public interface DeptFeignClient {

    /**
     * 根据条件获取后代部门索引
     *
     * @param id   部门id
     * @param type 指定部门类型
     * @return 后代部门索引
     */
    @PostMapping("/getDeptDescendantIndexes")
    HttpResult<List<DeptDTO>> getDeptDescendantIndexes(@RequestParam("id") String id, @RequestParam("type") List<Integer> type);

    /**
     * 根据区域获取部门id
     *
     * @param area
     * @return
     * @author xy
     */
    @GetMapping("/getDeptIdByArea")
    HttpResult<String> getDeptIdByArea(@RequestParam("area") String area);

    /**
     * 根据部门id获取区域id
     *
     * @param deptId
     * @return
     * @author denghuajun
     */
    @GetMapping("/getAreaIdByDeptId")
    HttpResult<String> getAreaIdByDeptId(@RequestParam("deptId") String deptId);

    /**
     * 获取所有部门
     */
    @GetMapping("/allDeptList")
    HttpResult<List<PvTerminalTreeVO>> allDeptList();

    /**
     * 根据部门id获取部门信息
     */
    @GetMapping("/getDeptById")
    HttpResult<Dept> getDeptById(@RequestParam("deptId") String deptId);

    /**
     * 根据部门code获取部门信息
     */
    @GetMapping("/getDeptByCode")
    HttpResult<Dept> getDeptByCode(@RequestParam("deptCode") String deptCode);

    /**
     * 根据部门id获取所有子部门ids包含自身
     */
    @GetMapping("/getDepSonIdtByDeptId")
    HttpResult<List<String>> getDepSonIdtByDeptId(@RequestParam("deptId") String deptId);

    /**
     * 根据部门id获取所有子部门ids
     */
    @GetMapping("/getDepSonSelfCodetByDeptId")
    HttpResult<List<String>> getDepSonSelfCodetByDeptId(@RequestParam("deptId") String deptId);

    /**
     * 根据部门code获取所有子部门codes
     */
    @GetMapping("/getDepSonSelfCodetByCode")
    HttpResult<List<String>> getDepSonSelfCodetByCode(@RequestParam("code") String code);


    /**
     * 根据部门id获取子部门ids
     */
    @GetMapping("/getDepSonIdByDeptId")
    HttpResult<List<String>> getDepSonIdByDeptId(@RequestParam("deptId") String deptId);

    /**
     * 根据部门id获取直接子部门及自身
     */
    @GetMapping("/getDirectSonSelf")
    HttpResult<List<Dept>> getDirectSonSelf(@RequestParam("deptId") String deptId);

    /**
     * 获取所有本部
     */
    @GetMapping("/getSpecialDeptList")
    HttpResult<List<Dept>> getSpecialDeptList();

    /**
     * 获取根部门
     */
    @GetMapping("/getRootDept")
    HttpResult<Dept> getRootDept();

    /**
     * @Description: 获取当前部门的的下级子部门list，如果没子部门就是返回当前部门
     * @Param: [deptId]
     * @return: com.njcn.common.pojo.response.HttpResult<java.util.List < com.njcn.user.pojo.po.Dept>>
     * @Author: clam
     * @Date: 2023/1/10
     */
    @GetMapping("/getDepSonDetailIdByDeptId")
    HttpResult<List<DeptDTO>> getDepSonDetailByDeptId(@RequestParam("deptId") String deptId);

    /**
     * 根据部门id查询当前部门所有父级部门id
     * @param deptId
     * @return
     */
    @GetMapping("/getUpByDeptIds")
    HttpResult<List<String>> getUpByDeptIds(@RequestParam("deptId") String deptId);

    /**
     * 根据单位集合查询对应部门
     * @param list code集合
     * @return
     */
    @PostMapping("/getDeptByCodeList")
    HttpResult<List<Dept>> getDeptByCodeList(@RequestBody List<String> list);


    @PostMapping("/getDeptInfoListByIds")
    HttpResult<List<Dept>> getDeptInfoListByIds(@RequestBody List<String> deptIds);

    /**
     * 获取所有的部门集合
     * @author xy
     * @date 2023/12/11
     */
    @GetMapping("/getAllDept")
    HttpResult<List<Dept>> getAllDept();

    @GetMapping("/orgTreeSelector")
    HttpResult<List<Tree<String>>> orgTreeSelector();
}
