package com.artfess.rescue.utils;

import com.artfess.base.context.BaseContext;
import com.artfess.base.feign.UCFeignService;
import com.artfess.base.query.FieldRelation;
import com.artfess.base.query.QueryFilter;
import com.artfess.base.query.QueryOP;
import com.artfess.base.util.AppUtil;
import com.artfess.base.util.BeanUtils;
import com.artfess.base.util.StringUtil;
import com.artfess.uc.api.impl.util.ContextUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Component
public class UserControlUtils {
    @Resource
    UCFeignService feignService;
    @Resource
    BaseContext baseContext;

    /**
     * 限制在部门层级，自己部门查看自己部门的数据
     *
     * @param queryFilter
     */
    public void addDeptPermission(QueryFilter<?> queryFilter) {
        String deptId = baseContext.getCurrentDeptId();
        List<ObjectNode> childOrg = feignService.getChildOrg(deptId);
        List<String> collect = new ArrayList<>();
        for (ObjectNode jsonNodes : childOrg) {
            String id = jsonNodes.get("id").asText();
            collect.add(id);
        }
        collect.add(deptId);
        String orgIds = collect.stream().collect(Collectors.joining(","));
        queryFilter.addFilter("CREATE_COMPANY_ID_", String.join("','", orgIds), QueryOP.IN, FieldRelation.AND);
    }

    /**
     * 限制在部门层级，自己部门查看自己部门的数据
     *
     * @param queryFilter
     */
    public void addOrgPermission(QueryFilter<?> queryFilter, String orgName) {
        String orgId = baseContext.getCurrentOrgId();
        List<ObjectNode> childOrg = feignService.getChildOrg(orgId);
        List<String> collect = new ArrayList<>();
        for (ObjectNode jsonNodes : childOrg) {
            String id = jsonNodes.get("id").asText();
            collect.add(id);
        }
        collect.add(orgId);
        String orgIds = collect.stream().collect(Collectors.joining(","));
        queryFilter.addFilter(orgName, String.join("','", orgIds), QueryOP.IN, FieldRelation.AND);
    }

    /**
     * 获取当前用户组织下所有子组织
     * @return
     */
//   public List<String> getOrgIds(){
//        String currentOrgId = baseContext.getCurrentOrgId();
//        List<ObjectNode> childOrg = feignService.getChildOrg(currentOrgId);
//        List<String> collect = new ArrayList<>();
//        for (ObjectNode jsonNodes : childOrg) {
//            String id = jsonNodes.get("id").asText();
//            collect.add(id);
//        }
//        collect.add(currentOrgId);
//        return collect;
//    }

    public List<String> getOrgIds(){
        String currentOrgId = baseContext.getCurrentOrgId();
        List<ObjectNode> childOrg = feignService.getOrgHierarchy(currentOrgId);
        List<String> collect = new ArrayList<>();
        for (ObjectNode jsonNodes : childOrg) {
            String id = jsonNodes.get("id").asText();
            collect.add(id);
        }
        collect.add(currentOrgId);
        return collect;
    }

    public List<String> getOrgIds(String currentOrgId){
        List<ObjectNode> childOrg = feignService.getChildOrg(currentOrgId);
        List<String> collect = new ArrayList<>();
        for (ObjectNode jsonNodes : childOrg) {
            String id = jsonNodes.get("id").asText();
            collect.add(id);
        }
        collect.add(currentOrgId);
        return collect;
    }

    public String getOrgGrade(){
       //定义查询的级别
       List<String> gradeList=new ArrayList<>();
       gradeList.add("1");
       gradeList.add("2");
       gradeList.add("3");
        UCFeignService service = AppUtil.getBean(UCFeignService.class);
        String userId = baseContext.getCurrentUserId();
        if(StringUtil.isNotEmpty(userId)) {
            ObjectNode orgObj = service.getMainGroup(userId);
            //当满足该级别且为ogn时，直接返回组织id，否则递归去查找,直到满足条件
            if (BeanUtils.isNotEmpty(orgObj)) {
                String orgKind = orgObj.get("orgKind").asText();
                String grade = orgObj.get("grade").asText();
                if(orgKind.equals("ogn")&&gradeList.contains(grade)){
                    return orgObj.get("id").asText();
                } else {
                    return getParentOrgGrade(orgObj.get("parentId").asText(),"id");
                }
            }
        }
        return "";
    }

    public static String getParentOrgGrade(String parentId,String attrName){
        try {
            //定义查询的级别
            List<String> gradeList=new ArrayList<>();
            gradeList.add("1");
            gradeList.add("2");
            gradeList.add("3");
            UCFeignService service = AppUtil.getBean(UCFeignService.class);
            ObjectNode parentOrgObj = service.getOrgByIdOrCode(parentId);
            if(BeanUtils.isNotEmpty(parentOrgObj)){
                String orgKind = parentOrgObj.get("orgKind").asText();
                String grade = parentOrgObj.get("grade").asText();
                if(orgKind.equals("ogn")&&gradeList.contains(grade)){
                    return parentOrgObj.get(attrName).asText();
                } else{
                    String parentOrgParentId = parentOrgObj.get("parentId").asText();
                    return getParentOrgGrade(parentOrgParentId,attrName);
                }
            }
        } catch (Exception e) {

        }
        return "";
    }

    /**
     * 增加创建单位，限制为当前用户的单位
     *
     * @param queryFilter
     */
    public void addPermissionByCreateOrgId(QueryFilter<?> queryFilter) {
        String currentOrgId = baseContext.getCurrentOrgId();
        List<ObjectNode> childOrg = feignService.getChildOrg(currentOrgId);
        List<String> collect = new ArrayList<>();
        for (ObjectNode jsonNodes : childOrg) {
            String id = jsonNodes.get("id").asText();
            collect.add(id);
        }
        collect.add(currentOrgId);
        String orgIds = collect.stream().collect(Collectors.joining(","));
        queryFilter.addFilter("CREATE_ORG_ID_", String.join("','", orgIds), QueryOP.IN, FieldRelation.AND);
    }

    /**
     * 权限限制-查询自己部门的
     *
     * @param queryFilter
     */
    public void addPermissionByCreateDeptId(QueryFilter<?> queryFilter) {
        String deptId = baseContext.getCurrentDeptId();
        queryFilter.addFilter("CREATE_COMPANY_ID_", deptId, QueryOP.EQUAL, FieldRelation.AND);
    }

}
