package com.sys.bus.jx.service;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.aop.Before;
import com.jfinal.aop.Enhancer;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.tx.Tx;
import com.sys.bus.hr.model.Person;
import com.sys.bus.hr.service.HrService;
import com.sys.bus.jx.vo.DeptDto;
//import com.sys.bus.model.DeptManager;
import com.sys.core.model.PageBean;
import com.sys.core.utils.ShrOsf;
import com.sys.core.utils.Tool;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class DeptManagerService {
    Log log = LogFactory.getLog(this.getClass());
    static HrService hrService = Enhancer.enhance(HrService.class);
    static boolean syncFlag = false;//防重复调用

//    /**
//     * @param pageNumber
//     * @param pageSize
//     * @param deptName
//     * @param managerName
//     * @return
//     */
//    public PageBean getDeptManagerQueryList(Integer pageNumber, Integer pageSize, String deptName,String managerName,String hrSame) {
//
//        String sqlCount  =
//                "select  count(1)  from ct_jx_deptmanager dm  left join t_org_admin org on dm.deptmanager_id = org.fid  where deptmanager_status='1'  " ;
//
//
//        String sqlPara  =
//                " select  dm.*,org.fname_l2 deptmanager_deptname ,org.fdisplayname_l2 deptmanager_deptlongname   from ct_jx_deptmanager dm " +
//                        " left join t_org_admin org on dm.deptmanager_id = org.fid where deptmanager_status='1'   " ;
//
//        String whereBy = "";
//        if(!StringUtils.isBlank(deptName)){
//            whereBy += " and  org.fname_l2 like '%"+deptName+"%' ";
//        }
//        if(!StringUtils.isBlank(managerName)){
//            whereBy += " and  (dm.deptmanager_pname1 like '%"+managerName+"%'  or dm.deptmanager_pname2 like '%"+managerName+"%'  or dm.deptmanager_pname3 like '%"+managerName+"%' "
//            +" or dm.deptmanager_hrpname1 like '%"+managerName+"%'  or dm.deptmanager_hrpname2 like '%"+managerName+"%'  or dm.deptmanager_hrpname3 like '%"+managerName+"%' )"  ;
//        }
//        if(!StringUtils.isBlank(hrSame)){
//            whereBy += " and deptmanager_hrsame='"+hrSame+"' "  ;
//        }
//        sqlCount += whereBy;
//        sqlPara += whereBy;
//
//        sqlPara += "order by org.fdisplayname_l2";//
//        PageBean pageBean = new PageBean();
//        Page<DeptManager> page = new DeptManager().dao().paginateByFullSql(pageNumber, pageSize, sqlCount, sqlPara);
//        pageBean.setCount(page.getTotalRow());
//        List list = page.getList();
//        setLongDept(list);
//        pageBean.setData(list);
//
//        return pageBean;
//    }
//    private void setLongDept(List<DeptManager> list){
//        if(list == null || list.size()==0)return;
//        String startName= "刀锋集团_刀锋互娱_";
//        int startLen = startName.length();
//        for(DeptManager dm : list){
//            String deptname = dm.getStr("deptmanager_deptlongname");
//            if(deptname == null || !deptname.startsWith(startName)){
//                continue;
//            }
//            deptname = deptname.substring(startLen);
//            for (int i = 0; i <10 ; i++) {
//                int len = deptname.length();
//                if(deptname.replace("_","").length()>= len-2){
//                    dm.put("deptmanager_deptname",deptname);
//                    break;
//                }
//                deptname = deptname.substring(deptname.indexOf("_")+1);
//            }
//        }
//    }
//    @Before(Tx.class)
//    /**
//     * 修改保存上级数据  返回same
//     */
//    public String updateDeptManager(String deptId,String type, String managerId,String managerName) {
//        DeptManager deptManager = DeptManager.dao.findById(deptId);
//        return this.updateDeptManager(deptManager,type, managerId, managerName);
//    }
//    /**
//     * 删除上级数据  返回same
//     */
//    public String deleteDeptManager(String deptId,String type) {
//        DeptManager deptManager = DeptManager.dao.findById(deptId);
//        return this.deleteDeptManager(deptManager,type);
//    }
//
//    public String deleteDeptManager(DeptManager deptManager,String type){
//
//        if("1".equals(type)){
//            deptManager.setDeptManagerPid1(null);
//            deptManager.setDeptManagerPname1(null);
//        }
//        if("2".equals(type)){
//            deptManager.setDeptManagerPid2(null);
//            deptManager.setDeptManagerPname2(null);
//        }
//        if("3".equals(type)){
//            deptManager.setDeptManagerPid3(null);
//            deptManager.setDeptManagerPname3(null);
//        }
//        boolean sameManager = isSameManager(deptManager);
//        deptManager.setDeptManagerHrsame(sameManager?"1":"2");
//        deptManager.setDeptManagerUpdatetime(Tool.getCurrTime());
//        deptManager.setDeptManagerUpdate("2");
//        deptManager.update();
//        return deptManager.getDeptManagerHrsame();
//    }
//
//    /**
//     *  修改保存上级数据  返回same
//     */
//    @Before(Tx.class)
//    public String updateDeptManager(DeptManager deptManager,String type, String managerId,String managerName){
//
//        if("1".equals(type)){
//            deptManager.setDeptManagerPid1(managerId);
//            deptManager.setDeptManagerPname1(managerName);
//        }
//        if("2".equals(type)){
//            deptManager.setDeptManagerPid2(managerId);
//            deptManager.setDeptManagerPname2(managerName);
//        }
//        if("3".equals(type)){
//            deptManager.setDeptManagerPid3(managerId);
//            deptManager.setDeptManagerPname3(managerName);
//        }
//        boolean sameManager = isSameManager(deptManager);
//        deptManager.setDeptManagerHrsame(sameManager?"1":"2");
//        deptManager.setDeptManagerUpdatetime(Tool.getCurrTime());
//        deptManager.setDeptManagerUpdate("2");
//        deptManager.update();
//        return deptManager.getDeptManagerHrsame();
//    }
//    public boolean  isSameManager(DeptManager deptManager){
//        String managerId1 = deptManager.getDeptManagerPid1();
//        String managerId2 = deptManager.getDeptManagerPid2();
//        String managerId3 = deptManager.getDeptManagerPid3();
//
//        String hrManagerId1 = deptManager.getDeptManagerHrpid1();
//        String hrManagerId2 = deptManager.getDeptManagerHrpid2();
//        String hrManagerId3 = deptManager.getDeptManagerHrpid3();
//
//        if(!isSame(managerId1,hrManagerId1)){
//            return false;
//        }
//        if(!isSame(managerId2,hrManagerId2)){
//            return false;
//        }
//        if(!isSame(managerId3,hrManagerId3)){
//            return false;
//        }
//        return true;
//    }
//
//    private boolean isSame(String str1,String str2){
//        if(str1 == null && str2 == null){
//            return true;
//        }
//        if((str1 == null )!= (str2 == null)){
//            return false;
//        }
//        return str1.equals(str2);
//    }
//    @Before(Tx.class)
//    public void syncDeptManager(boolean syncAll){
//        if(syncFlag){
//            log.error("正在同步中。。请稍后再试！");
//            return;
//        }
//        syncFlag = true;
//        try{
//            List<DeptManager> deptManagers = new DeptManager().dao().find(" select * from ct_jx_deptmanager ");
//            Map<String, DeptManager> deptManagerMap = deptManagers.stream().collect(Collectors.toMap(DeptManager::getDeptManagerId, deptManager -> deptManager));
//
//            Map<String, DeptManager> shrDeptManagerMap = this.getShrDeptManagerMap();
//            for(String deptId : shrDeptManagerMap.keySet()){
//                DeptManager newDeptManager = shrDeptManagerMap.get(deptId);
//                if(!deptManagerMap.containsKey(deptId)){//新部门信息
//                    newDeptManager.save();
//                    continue;
//                }
//                //已有配置信息
//                DeptManager deptManager = deptManagerMap.get(deptId);
//                String status = deptManager.getDeptManagerStatus();
//                String hrSame = deptManager.getDeptManagerHrsame();
//                String update = deptManager.getDeptManagerUpdate();
//                String currTime = Tool.getCurrTime();
//                String oldCreatetime = deptManager.getDeptManagerCreatetime();
//
//                newDeptManager.setDeptManagerUpdatetime(currTime);
//                newDeptManager.setDeptManagerCreatetime(oldCreatetime);
//                if(syncAll){//全量同步
//                    newDeptManager.update();
//                    continue;
//                }
//                //增量同步
//                if("2".equals(status)){//禁用的，直接启用新的
//                    newDeptManager.update();
//                }else if("1".equals(hrSame) || !"2".equals(update)){//正常状态、配置相同或未手工更新的 ,直接按新数据更新
//                    newDeptManager.update();
//                }else{//更新hr数据
//                    deptManager.setDeptManagerHrpid1(newDeptManager.getDeptManagerHrpid1());
//                    deptManager.setDeptManagerHrpid2(newDeptManager.getDeptManagerHrpid2());
//                    deptManager.setDeptManagerHrpid3(newDeptManager.getDeptManagerHrpid3());
//                    deptManager.setDeptManagerHrpname1(newDeptManager.getDeptManagerHrpname1());
//                    deptManager.setDeptManagerHrpname2(newDeptManager.getDeptManagerHrpname2());
//                    deptManager.setDeptManagerHrpname3(newDeptManager.getDeptManagerHrpname3());
//
//                    boolean sameManager = isSameManager(deptManager);
//                    deptManager.setDeptManagerHrsame(sameManager?"1":"2");
//                    deptManager.setDeptManagerUpdatetime(currTime);
//                    //deptManager.setDeptManagerUpdate("1");
//                    deptManager.update();
//                }
//
//            }
//            for(String deptId : deptManagerMap.keySet()){// 不存在的部门进行禁用处理
//                if(!shrDeptManagerMap.containsKey(deptId)){
//                    DeptManager deptManager = deptManagerMap.get(deptId);
//                    deptManager.setDeptManagerStatus("2");
//                    deptManager.setDeptManagerUpdatetime(Tool.getCurrTime());
//                    deptManager.update();
//                }
//            }
//        }catch (Exception e){
//           throw e;
//        }finally {
//            syncFlag = false;
//        }
//
//
//    }
//
//    private Map<String, DeptManager> getShrDeptManagerMap(){
//        String shrUrl = PropKit.get("shrUrl");
//        Object data =  ShrOsf.callOSF(shrUrl,"inteOAGetAdminOrgDataServiceExt", new HashMap<String,Object>());
//        if(data==null){
//            throw new RuntimeException("获取shr组织二开接口异常！");
//        }
//        if(data.toString().indexOf("\"error\":")>=0){
//            throw new RuntimeException("获取shr组织二开接口异常！"+data.toString());
//        }
//        JSONArray jsonArray = JSON.parseArray(data.toString());
//        if(jsonArray.size()<10){
//            throw new RuntimeException("获取shr组织二开接口异常！(组织个数小于10个)");
//        }
//        Map<String,DeptManager> map = new HashMap<>();
//
//        List<Person> allEnablePerson = hrService.getAllEnablePerson();
//        Map<String, Person> personMap = allEnablePerson.stream().collect(Collectors.toMap(Person::getId, person -> person));
//        for(int i=0;i<jsonArray.size();i++) {
//            JSONObject deptJson = (JSONObject)jsonArray.get(i);
//            DeptDto deptDto = JSONUtil.toBean(deptJson.toJSONString(),DeptDto.class);
//            String deptId = deptDto.getEasdept_id();
//            DeptManager deptManager = new DeptManager();
//            deptManager.setDeptManagerId(deptId);
//            map.put(deptId,deptManager);
//            setDeptManager(deptManager,deptDto,personMap);
//        }
//        return map;
//    }
//
//    private void setDeptManager(DeptManager deptManager,DeptDto dept,Map<String, Person> personMap){
//        String groupLeaders = dept.getGroupLeaders();
//        String directors = dept.getDirectors();
//        String managers = dept.getManagers();
//        String hrSame = "1";
//        if(StringUtils.isNotEmpty(groupLeaders)){
//            String[] ids = groupLeaders.split(",");
//            deptManager.setDeptManagerPid1(ids[0]);
//            deptManager.setDeptManagerHrpid1(groupLeaders);
//            String names = "";
//            if(ids.length>1)hrSame="2";
//            for (int i = 0; i < ids.length; i++) {
//                Person person = personMap.get(ids[i]);
//                if(i == 0){
//                    deptManager.setDeptManagerPname1(person==null?"异常数据":person.getName());
//                    names += person==null?"异常数据":person.getName();
//                }else{
//                    names += ";"+(person==null?"异常数据":person.getName());
//                }
//            }
//            deptManager.setDeptManagerHrpname1(names);
//        }
//        if(StringUtils.isNotEmpty(directors)){
//            String[] ids = directors.split(",");
//            deptManager.setDeptManagerPid2(ids[0]);
//            deptManager.setDeptManagerHrpid2(directors);
//            String names = "";
//            if(ids.length>1)hrSame="2";
//            for (int i = 0; i < ids.length; i++) {
//                Person person = personMap.get(ids[i]);
//                if(i == 0){
//                    deptManager.setDeptManagerPname2(person==null?"异常数据":person.getName());
//                    names += person==null?"异常数据":person.getName();
//                }else{
//                    names += ";"+(person==null?"异常数据":person.getName());
//                }
//            }
//            deptManager.setDeptManagerHrpname2(names);
//        }
//        if(StringUtils.isNotEmpty(managers)){
//            String[] ids = managers.split(",");
//            deptManager.setDeptManagerPid3(ids[0]);
//            deptManager.setDeptManagerHrpid3(managers);
//            String names = "";
//            if(ids.length>1)hrSame="2";
//            for (int i = 0; i < ids.length; i++) {
//                Person person = personMap.get(ids[i]);
//                if(i == 0){
//                    deptManager.setDeptManagerPname3(person==null?"异常数据":person.getName());
//                    names += person==null?"异常数据":person.getName();
//                }else{
//                    names += ";"+(person==null?"异常数据":person.getName());
//                }
//            }
//            deptManager.setDeptManagerHrpname3(names);
//        }
//        deptManager.setDeptManagerHrsame(hrSame);
//        deptManager.setDeptManagerCreatetime(Tool.getCurrTime());
//        deptManager.setDeptManagerStatus("1");
//    }
//
//    public Person getManager(String deptId,int level){
//
//        DeptManager deptManager = DeptManager.dao.findById(deptId);
//        return getManager(deptManager,level);
//    }
//    public Person getManager(DeptManager deptManager,int level){
//        if(deptManager == null){
//            return null;
//        }
//        if(level>3){
//            return null;
//        }
//        String pid1 = deptManager.getDeptManagerPid1();
//        String pid2 = deptManager.getDeptManagerPid2();
//        String pid3 = deptManager.getDeptManagerPid3();
//        String[] pids = new String[]{pid1,pid2,pid3};
//        String pid = pids[level-1];
//        Person person = null;
//        if(StringUtils.isNotBlank(pid)){
//            person = hrService.getEnablePersonById(pid);
//        }
//        if(person != null){
//            return person;
//        }
//
//        return getManager(deptManager,level+1);
//    }
//    /**
//     * 获取部门 领导+实际层级
//     * @param deptId
//     * @param level
//     * @return
//     */
//    public Object[] getManagerAndLv(String deptId,int level){
//
//        DeptManager deptManager = DeptManager.dao.findById(deptId);
//        return getManagerAndLv(deptManager,level);
//    }
//
//    public boolean isManager(String deptId,String pid){
//        DeptManager deptManager = DeptManager.dao.findById(deptId);
//        String pid1 = deptManager.getDeptManagerPid1();
//        String pid2 = deptManager.getDeptManagerPid2();
//        String pid3 = deptManager.getDeptManagerPid3();
//        if(pid.equals(pid1) || pid.equals(pid2) || pid.equals(pid3)){
//            return true;
//        }
//        return false;
//    }
//    /**
//     * 获取部门 领导+实际层级
//     * @param deptManager
//     * @param level
//     * @return
//     */
//    public Object[] getManagerAndLv(DeptManager deptManager,int level){
//        if(deptManager == null){
//            return null;
//        }
//        if(level>3){
//            return null;
//        }
//        String pid1 = deptManager.getDeptManagerPid1();
//        String pid2 = deptManager.getDeptManagerPid2();
//        String pid3 = deptManager.getDeptManagerPid3();
//        String[] pids = new String[]{pid1,pid2,pid3};
//
//        LinkedHashMap<Integer, Person> lvManagerPersons = getLvManagerPerson(pids, level);
//        Integer managerLv = null;
//        Person manager = null;
//        for (Integer lv : lvManagerPersons.keySet()) {
//            if(managerLv == null){
//                managerLv = lv;
//                manager = lvManagerPersons.get(managerLv);
//                continue;
//            }
//            if(lvManagerPersons.get(lv).getId().equals(manager.getId())){
//                managerLv = lv;
//            }else{
//                break;
//            }
//        }
//        return new Object[]{manager,managerLv};
//    }
//    private LinkedHashMap<Integer,Person> getLvManagerPerson(String[] pids,Integer lv){
//        LinkedHashMap<Integer,Person> map = new LinkedHashMap<>();
//        return getLvManagerPerson(pids,lv,map);
//    }
//    private LinkedHashMap<Integer,Person> getLvManagerPerson(String[] pids,Integer lv,LinkedHashMap<Integer,Person> map){
//        if(map == null)map = new LinkedHashMap<Integer,Person>();
//        if(lv>3){
//            return map;
//        }
//        String pid = pids[lv-1];
//        Person person = null;
//        if(StringUtils.isNotBlank(pid)){
//            person = hrService.getEnablePersonById(pid);
//        }
//        if(person!=null)map.put(lv,person);
//
//       return getLvManagerPerson(pids,lv+1,map);
//    }
//
//    public Person getManager(String deptId,int level,Map<String,Person> personMap){
//
//        DeptManager deptManager = DeptManager.dao.findById(deptId);
//        return getManager(deptManager,level,personMap);
//    }
//    public Person getManager(DeptManager deptManager,int level,Map<String,Person> personMap){
//        if(deptManager == null){
//            return null;
//        }
//        if(level>3){
//            return null;
//        }
//        String pid1 = deptManager.getDeptManagerPid1();
//        String pid2 = deptManager.getDeptManagerPid2();
//        String pid3 = deptManager.getDeptManagerPid3();
//        String[] pids = new String[]{pid1,pid2,pid3};
//        String pid = pids[level-1];
//        Person person = null;
//        if(StringUtils.isNotBlank(pid)){
//            person = personMap.get(pid);
//        }
//        if(person != null){
//            return person;
//        }
//
//        return getManager(deptManager,level+1,personMap);
//    }
//



}