package com.engine.htsc.branch.approvalChain.tools;

import com.engine.htsc.branch.approvalChain.dao.UfFzjgfkgwppDao;
import com.engine.htsc.branch.approvalChain.model.FzjgDept;
import com.engine.htsc.branch.approvalChain.model.FzjgUser;
import com.engine.htsc.branch.approvalChain.model.FzjgsplVo;
import com.engine.htsc.branch.approvalChain.model.UfFzjgspl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import weaver.conn.RecordSet;
import weaver.general.Util;
import weaver.interfaces.htsc.GlobatTools.JAVATools;

import java.util.*;
import weaver.interfaces.htsc.comInfo.PropBean;

public class ServiceTools {

    private final UfFzjgfkgwppDao ufFzjgfkgwppDao = new UfFzjgfkgwppDao();

    public List<FzjgsplVo> convertModelToVO(List<UfFzjgspl> ufFzjgsplList, String userId, Map<String,String> map) {
        List<FzjgsplVo> resultList = new ArrayList<>();
        //获取人员及部门信息
        FzjgUser fzjgUser = new FzjgUser(userId);
        FzjgDept fzjgDept = new FzjgDept(fzjgUser.getDepartmentId());
        if ("fzjgclbx".equals(map.get("unnumber"))){
            fzjgUser.setDepartmentId(Util.null2String(map.get("szbm")));
            fzjgDept = new FzjgDept(Util.null2String(map.get("szbm")));
            fzjgUser.setFzjgDept(fzjgDept);
        }
        List<UfFzjgspl> ufFzjgsplBm = new ArrayList<>();
        List<UfFzjgspl> ufFzjgsplJg = new ArrayList<>();
        List<UfFzjgspl> ufFzjgsplListR = new ArrayList<>();
        //bxrbmfzr 报销人部门负责人,前端传入
        String bxrbmfzr = Util.null2String(map.get("bxrbmfzr"));
        String ngr = Util.null2String(map.get("ngr"));
        String bxry = Util.null2String(map.get("bxry"));

        //过滤审批链
        for (UfFzjgspl ufFzjgspl:ufFzjgsplList){
            //判断条件
            if(null!=ufFzjgspl.getTj()&&!"".equals(ufFzjgspl.getTj())){
                if(!getConitionParams(ufFzjgspl.getTj(),map)){
                    continue;
                }
            }
            //判断部门和机构，先部门再机构
            if (null!=ufFzjgspl.getBm()&&!"".equals(ufFzjgspl.getBm())){
                List<String> list = Arrays.asList(ufFzjgspl.getBm().split(","));
                //满足部门条件后不判断机构
                if (!list.contains(fzjgUser.getDepartmentId())){
                    continue;
                }else {
                    ufFzjgsplBm.add(ufFzjgspl);
                }
            }else if (null!=ufFzjgspl.getJg()&&!"".equals(ufFzjgspl.getJg())){
                //部门为空则判断机构
                if (!ufFzjgspl.getJg().equals(fzjgDept.getDeptTypeCode())){
                    continue;
                }else {
                    ufFzjgsplJg.add(ufFzjgspl);
                }
            }
        }
        if (null==ufFzjgsplBm||ufFzjgsplBm.size()==0){
            ufFzjgsplListR.addAll(ufFzjgsplJg);
        }else {
            ufFzjgsplListR.addAll(ufFzjgsplBm);
        }
        for (UfFzjgspl ufFzjgspl:ufFzjgsplListR){
            FzjgsplVo fzjgsplVo = getVo(ufFzjgspl,fzjgUser,bxrbmfzr,bxry,ngr,map);
            resultList.add(fzjgsplVo);
        }
        return resultList;
    }

    //将符合要求的审批链进行处理将审批链中的条件转换为userid
    public FzjgsplVo getVo(UfFzjgspl ufFzjgspl,FzjgUser fzjgUser,String bxrbmfzr,String bxry,String ngr,Map<String,String> map) {
        FzjgsplVo fzjgsplVo = new FzjgsplVo();
        fzjgsplVo.setCxspr(fzjgUser);
        fzjgsplVo.setUfFzjgspl(ufFzjgspl);
        //费用确认fyqr
        fzjgsplVo.setFyqr(getFyqrDept(Util.null2String(ufFzjgspl.getFyqr()),ngr,bxry));
        //分公司二级部门负责人
        fzjgsplVo.setEjbmfzr(getTwoDept(Util.null2String(ufFzjgspl.getEjbmfzr()),fzjgUser,bxrbmfzr));
        //营业部负责人
        fzjgsplVo.setYybbmfzr(getYybDept(Util.null2String(ufFzjgspl.getYybbmfzr()),fzjgUser,bxrbmfzr));

        //获取财务中心数据
        Map<String,String> cwzxMap = ufFzjgfkgwppDao.getBybm(fzjgUser.getDepartmentId());

        //财务中心会计
        fzjgsplVo.setCwzxhj(getCwkj(Util.null2String(ufFzjgspl.getCwzxhj()),fzjgUser,cwzxMap,ufFzjgspl.getSslc()));
        //分支机构差旅报销是存在的财务中心会计的特殊逻辑
        if("fzjgclbx".equals(Util.null2String(ufFzjgspl.getSslc()))){
            if("1".equals(Util.null2String(map.get("sfzf")))&&"0".equals(Util.null2String(map.get("fzzdsfgfyhj")))){

                PropBean pb = new PropBean();
                Set<String> skipKjSet = new HashSet<>(Arrays.asList(pb.getPropName("FZJG_FGS_SKIP_FYKJ").split(",")));
                Set<String> subDeptSet = getSubDeptSet(skipKjSet);
                skipKjSet.addAll(subDeptSet);
                if (skipKjSet.contains(fzjgUser.getFzjgDept().getDepartmentCode())){
                    fzjgsplVo.setCwzxhj("");
                }
            }
        }

        //财务中心经理
        fzjgsplVo.setCwzxjl(getCwjl(Util.null2String(ufFzjgspl.getCwzxjl()),fzjgUser,cwzxMap));

        //北京西北营业部负责人
        fzjgsplVo.setBjxbyybfzr(getBjxbyybfzr(Util.null2String(ufFzjgspl.getBjxbyybfzr()),fzjgUser,bxrbmfzr));

        //分公司部门负责人
        fzjgsplVo.setFgsbmfzr(getFgsbmfzr(Util.null2String(ufFzjgspl.getFgsbmfzr()),fzjgUser,cwzxMap));

        //上级部门负责人
        fzjgsplVo.setSjbmfzr(getSjbmfzr(Util.null2String(ufFzjgspl.getSjbmfzr()),fzjgUser,cwzxMap));

        //总部财务审核
        fzjgsplVo.setZbcw(getZbcw(Util.null2String(ufFzjgspl.getZbcw()),fzjgUser,cwzxMap));

        //首席财务官
        fzjgsplVo.setSxcwg(getSxcwg(Util.null2String(ufFzjgspl.getSxcwg()),fzjgUser,cwzxMap));

        //出纳
        fzjgsplVo.setCn(getCn(Util.null2String(ufFzjgspl.getCn()),fzjgUser,cwzxMap));

        return fzjgsplVo;
    }

    //判断条件逻辑与和逻辑或 ：|| ，&&
    public static boolean getConitionParams(String tj, Map<String,String> detailmap){
        boolean flag=false;
        if("".equals(tj)){
            return true;
        }
        String value="";
        List<String> list=new ArrayList();

        String[] split=tj.split("\\|\\|");
        for (String tjsplitljy:split) {
            //开始做逻辑与操作
            String[] splitljy = tjsplitljy.split("\\&\\&");
            list=new ArrayList();
            for (String tjsplitvalue : splitljy) {
                if(tjsplitvalue.split("#").length==3){
                    list.add(tjsplitvalue.replace("#",""));
                }else {
                    list.add(tjsplitvalue);
                }
            }
            for (String tjvalue : list) {
                flag = IsConform(tjvalue, detailmap);
                if (flag == false) {
                    break;
                }
            }
            if(flag==true){
                break;
            }
        }
        return flag;
    }

    //判断是否符合要求
    public static boolean IsConform(String tj,Map<String,String> map){
        boolean flag=true;
        String[] params = getParamsSplit(tj);
        if(params==null){
            return false;
        }
        String key = params[0];
        String value = params[1];
        String conition = params[2];
        if (">=".equals(conition)){
            Double valuedouble= Util.getDoubleValue(Util.null2String(map.get(key)));
            if(!getDoubleIsNull(valuedouble)){
                flag=false;
            }
            if( valuedouble<Util.getDoubleValue(value)){
                flag=false;
            }
        }else if ("<=".equals(conition)){
            Double valuedouble= Util.getDoubleValue(Util.null2String(map.get(key)));
            if(!getDoubleIsNull(valuedouble)){
                flag=false;
            }
            if(valuedouble >Util.getDoubleValue(value)){
                flag=false;
            }
        }else if (">".equals(conition)){
            Double valuedouble= Util.getDoubleValue(Util.null2String(map.get(key)));
            if(!getDoubleIsNull(valuedouble)){
                flag=false;
            }
            if(valuedouble <=Util.getDoubleValue(value)){
                flag=false;
            }
        }else if ("<".equals(conition)){
            Double valuedouble= Util.getDoubleValue(Util.null2String(map.get(key)));
            if(!getDoubleIsNull(valuedouble)){
                flag=false;
            }
            if(valuedouble >=Util.getDoubleValue(value)){
                flag=false;
            }
        }else if ("!=".equals(conition)){
            if(Util.null2String(map.get(key)).equals(value)){
                flag=false;
            }
        }else if ("=".equals(conition)){
            if(!Util.null2String(map.get(key)).equals(value) ){
                flag=false;
            }
        }
        return  flag;
    }

    public static String[] getParamsSplit(String value){
        String[] values = new String[3];
        if(value.split(">=").length==2){
            values= JAVATools.ArrayCodyAtoB(value.split(">="),values);
            values[2]=">=";
            return values;
        }
        if(value.split("<=").length==2){
            values=JAVATools.ArrayCodyAtoB(value.split("<="),values);
            values[2]="<=";
            return values;
        }
        if(value.split(">").length==2){
            values=JAVATools.ArrayCodyAtoB(value.split(">"),values);
            values[2]=">";
            return values;
        }
        if(value.split("<").length==2){
            values=JAVATools.ArrayCodyAtoB(value.split("<"),values);
            values[2]="<";
            return values;
        }

        if(value.split("!=").length==2){
            values=JAVATools.ArrayCodyAtoB(value.split("!="),values);
            values[2]="!=";
            return values;
        }

        if(value.split("=").length==2){
            values=JAVATools.ArrayCodyAtoB(value.split("="),values);
            values[2]="=";
            return values;
        }


        return null;
    }

    public static boolean getDoubleIsNull(double i){
        boolean flag=true;
        if(i<0){
            flag=false;
        }
        return flag;
    }

    //根据type来获取人员
    public String getHrmType(String value){
        if("".equals(value)){
            return "";
        }
        if(value.indexOf("WK_")>=0){
            String workcode=value.split("WK_")[1];
            return JAVATools.GetWorkcodetoid(workcode);
        }
        return "";
    }

    //费用确认
    public String getFyqrDept(String value,String ngr,String bxry){
        String hrmids="";
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            //不是指定WK_则判断是否为1
            if("".equals(hrmid)){
                //如果是1的情况下，便从获取对应负责人id,劳务派遣人员不进行费用确认
                if ("1".equals(hrmst)&&StringUtils.isNotEmpty(bxry)){
                    FzjgUser bxryUser = new FzjgUser(bxry);
                    if(!bxry.equals(ngr)&&!bxryUser.getWorkCode().startsWith("p")){
                        bxry = distinctByCode(bxry,ngr);
                        hrmids+=hrmids==""?bxry:","+bxry;
                    }
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids ;
    }

    //二级部门负责人
    public String getTwoDept(String value,FzjgUser fzjgUser,String bxrbmfzr){
        String hrmids="";
        if("".equals(value)||"".equals(fzjgUser.getDepartmentId())||"".equals(fzjgUser.getId())){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            //不是指定WK_则判断是否为1
            if("".equals(hrmid)){
                //如果是1的情况下，便从获取对应负责人id
                if ("1".equals(hrmst)){
                    FzjgDept fzjgDept = new FzjgDept(fzjgUser.getDepartmentId());
                    //获取部门负责人,使用报销人部门负责人,前端传入
                    hrmids+=hrmids==""?bxrbmfzr:","+bxrbmfzr;
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids ;
    }

    //营业部负责人
    public String getYybDept(String value, FzjgUser bxry,String bxrbmfzr) {
        String hrmids="";
        if("".equals(value)||"".equals(bxry.getDepartmentId())||"".equals(bxry.getId())){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            //如果是1的情况下，那么则选择费用确认（仅自己）
            String hrmid=getHrmType(hrmst);
            if("".equals(hrmid)){
                if("1".equals(hrmst)){
                    //获取营业部门负责人都是本部门负责人0715
                    hrmids+=hrmids==""?bxrbmfzr:","+bxrbmfzr;
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids ;
    }

    //北京西北营业部负责人
    public String getBjxbyybfzr(String value, FzjgUser bxry,String bxrbmfzr) {
        String hrmids="";
        if("".equals(value)||"".equals(bxry.getDepartmentId())||"".equals(bxry.getId())){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            //如果是1的情况下，那么则选择费用确认（仅自己）
            String hrmid=getHrmType(hrmst);
            if("".equals(hrmid)){
                if("1".equals(hrmst)){
                    //获取营业部门负责人都是本部门负责人0715
                    hrmids+=hrmids==""?bxrbmfzr:","+bxrbmfzr;
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids ;
    }

    //财务中心会计
    public String getCwkj(String value, FzjgUser bxry, Map<String, String> cwzxMap,String lclx) {
        String hrmids="";
        //非分支机构差旅报销的流程，依然按照之前逻辑，会计节点返回空
        //对分支机构差旅报销，非名单之内的分公司发起的流程，无论是否有自付，都需要过会计节点
        if("".equals(value) && !lclx.equals("fzjgclbx")){
            return hrmids;
        }else{
            if(StringUtils.isEmpty(hrmids)){
                if(StringUtils.isNotEmpty(cwzxMap.get("kj"))){
                    hrmids = cwzxMap.get("kj");
                    return hrmids;
                }
            }
        }
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            if("".equals(hrmid)){
                if ("1".equals(hrmst)){
                    if (!"".equals(cwzxMap.get("kj"))) {
                        hrmids += hrmids == "" ? cwzxMap.get("kj") : "," + cwzxMap.get("kj");
                    }
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }

        return hrmids;
    }

    //财务中心出纳
    public String getCn(String value, FzjgUser bxry, Map<String, String> cwzxMap) {
        //暂定全部需要
        String hrmids="";
        String hrmid=getHrmType(value);
        if("".equals(hrmid)){
            //出纳暂时全都要
            if (!"".equals(cwzxMap.get("cn"))) {
                hrmids += hrmids == "" ? cwzxMap.get("cn") : "," + cwzxMap.get("cn");
            }
        }else{
            hrmids+=hrmids==""?hrmid:","+hrmid;
        }

        return hrmids;
    }

    //财务中心经理
    public String getCwjl(String value, FzjgUser fzjgUser, Map<String, String> cwzxMap) {
        String hrmids="";
        if("".equals(value)){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            if("".equals(hrmid)){
                if ("1".equals(hrmst)){
                    FzjgDept fzjgDept = new FzjgDept(fzjgUser.getDepartmentId());
                    String deptTypeCode = fzjgDept.getDeptTypeCode();
                    if ("JGLX03".equals(deptTypeCode)||"JGLX02".equals(deptTypeCode)){
                        hrmids += hrmids == "" ? cwzxMap.get("kjjl") : "," + cwzxMap.get("kjjl");
                    }else {
                        do {
                            fzjgDept = new FzjgDept(fzjgDept.getSupDepId());
                        }while (!"JGLX03".equals(fzjgDept.getDeptTypeCode())&&!"0".equals(fzjgDept.getSupDepId()));
                        Map<String,String> map = ufFzjgfkgwppDao.getBybm(fzjgDept.getId());
                        if (!"".equals(map.get("kjjl"))) {
                            hrmids += hrmids == "" ? map.get("kjjl") : "," + map.get("kjjl");
                        }
                    }
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }

        return hrmids;
    }

    //分公司部门负责人
    public String getFgsbmfzr(String value, FzjgUser fzjgUser, Map<String, String> cwzxMap) {
        String hrmids="";
        if("".equals(value)){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            if("".equals(hrmid)){
                if ("1".equals(hrmst)){
                    String userId = ""; //分公司部门负责人
                    FzjgDept fzjgDept = new FzjgDept(fzjgUser.getDepartmentId());
                    String deptTypeCode = fzjgDept.getDeptTypeCode();
                    if ("JGLX03".equals(deptTypeCode)){
                        userId = fzjgDept.getDeptDirectors();
                    }else {
                        do {
                            fzjgDept = new FzjgDept(fzjgDept.getSupDepId());
                        }while (!"JGLX03".equals(fzjgDept.getDeptTypeCode())&&!"0".equals(fzjgDept.getSupDepId()));
                        userId = fzjgDept.getDeptDirectors();
                    }
                    if (!"".equals(userId)) {
                        hrmids += hrmids == "" ? userId : "," + userId;
                    }
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids;
    }

    //上级部门负责人
    public String getSjbmfzr(String value, FzjgUser fzjgUser, Map<String, String> cwzxMap) {
        String hrmids="";
        if("".equals(value)){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            if("".equals(hrmid)){
                if ("1".equals(hrmst)){
                    FzjgDept fzjgDept = new FzjgDept(fzjgUser.getDepartmentId());
                    FzjgDept supFzjgDept = new FzjgDept(fzjgDept.getSupDepId());
                    String userId = supFzjgDept.getDeptDirectors(); //上级部门负责人
                    if (!"".equals(userId)) {
                        hrmids += hrmids == "" ? userId : "," + userId;
                    }
                }
            }else{
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids;
    }


    //总部财务审核
    public String getZbcw(String value, FzjgUser fzjgUser, Map<String, String> cwzxMap) {
        String hrmids="";
        if("".equals(value)){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            if(!"".equals(hrmid)){
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids;
    }

    //首席财务官
    public String getSxcwg(String value, FzjgUser fzjgUser, Map<String, String> cwzxMap) {
        String hrmids="";
        if("".equals(value)){
            return hrmids;
        }
        for (String hrmst:value.split(",") ) {
            String hrmid=getHrmType(hrmst);
            if(!"".equals(hrmid)){
                hrmids+=hrmids==""?hrmid:","+hrmid;
            }
        }
        return hrmids;
    }

    //跨界点使用code去重，去除param中包含base的部分
    private String distinctByCode(String param, String base) {
        String result = "";
        if (!"".equals(param)){
            List<Map<String,String>> baseMapList = ufFzjgfkgwppDao.getUserMap(base);
            Map<String,String> baseMap = baseMapList.get(1);//parm
            List<Map<String,String>> paramMapList = ufFzjgfkgwppDao.getUserMap(param);
            Map<String, String> paramMap = paramMapList.get(1);//base
            //遍历paramMap，判断baseMap是否存在paramMap中的key值，若不存在则放入结果返回
            for(String code:paramMap.keySet()){
                if(null==baseMap.get(code)||"".equals(baseMap.get(code))){
                    result+=result==""? Util.null2String(paramMap.get(code)):","+ Util.null2String(paramMap.get(code));
                }
            }
        }
        return result;
    }

    private Set<String> getSubDeptSet(Set<String> subCompanySet){
        Set<String> subDeptSet = new HashSet<>();
        RecordSet rs = new RecordSet();
        String getSubSql = "select departmentcode from HRMDEPARTMENT a \n" +
                "where a.supdepid = \n" +
                "(select id from HRMDEPARTMENT b where b.departmentcode = ?) and canceled=0";
        for(String code : subCompanySet){
            rs.executeQuery(getSubSql,code);
            while(rs.next()){
                subDeptSet.add(rs.getString("departmentcode"));
            }
        }
        return subDeptSet;
    }
}