package com.bcxin.risk.nxzw;

import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.bcxin.risk.activity.*;
import com.bcxin.risk.activity.common.service.ActivityService;
import com.bcxin.risk.base.domain.util.CollectionUtil;
import com.bcxin.risk.base.domain.util.DateUtil;
import com.bcxin.risk.constant.DictConst;
import com.bcxin.risk.nxzw.enums.Area;
import com.bcxin.risk.nxzw.util.SMEncryptUtil;
import com.bcxin.risk.sys.SysBasicUtil;
import com.bcxin.risk.sys.resources.ConfigResources;
import com.bcxin.risk.user.dao.ContractorUserDao;
import com.bcxin.risk.user.domain.ContractorUser;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * <b> 办件推送接口 </b>
 * @author ZXF
 * @create 2022/11/15 0015 10:53
 * @version
 * @注意事项 </b>
 */
@Service
@Slf4j
public class NxZwSbService {

    @Autowired
    private ActivityDao activityDao;

    @Resource
    private ActivityService activityService;

    @Resource
    private ContractorUserDao contractorUserDao;

    @Resource
    private ActivityApprovalDao activityApprovalDao;

    @Resource
    private ActivityMaterialDao activityMaterialDao;

    /**
     * 收件
     */
    public boolean receive(Long activityId) {
        Activity activity = activityDao.findActivityByOid(activityId);
        String cdBatch = IdUtil.simpleUUID();
        String timestamp = System.currentTimeMillis()+"";
        String sign = SMEncryptUtil.sm3Encrypt(ConfigResources.NX_CLIENTID + "|" + ConfigResources.NX_SECRETID + "|"+ timestamp);
        UpProBody body = new UpProBody(ConfigResources.NX_CLIENTID,timestamp,sign,String.valueOf(activityId));
        body.setUpProAccept(setUpProAccept(activity,cdBatch));
        body.setUpProResult(setUpProResult(activity,cdBatch));
        body.setUpProMaterial(setUpProMaterialList(activity));
        body.setUpProProcess(setUpProProcessList(activity));
        body.setUpProSpecialProcedure(setUpProSpecialProcedureList(activity,cdBatch));

        String token = getToken();
        if(StringUtils.isEmpty(token)){
            return false;
        }
        System.out.println("Token:"+token);
        String resbody = JSONObject.toJSONString(body);
        System.out.println("请求报文1:"+resbody);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("resbody",SMEncryptUtil.sm4Encrypt(resbody));
//        System.out.println("请求报文2:"+jsonObject.toJSONString());
        // token鉴权
        String ret = HttpRequest.post(ConfigResources.NX_QUERY_URL+"collection")
                .header("Authorization", token)
//                .body(resbody)
                .body(jsonObject.toJSONString())
                .execute().body();
        System.out.println("返回报文:"+ret);
        if(StringUtils.isNotEmpty(ret)){
            ResultNX result = JSONObject.parseObject(ret,ResultNX.class);
            if(result.getCode()==200){
                return true;
            }
        }
        return false;
    }

    private UpProAccept setUpProAccept(Activity activity,String cdBatch){
        ContractorUser user = contractorUserDao.selectContractor(activity.getOrg().getOid());
        UpProAccept upProAccept = new UpProAccept();
        upProAccept.setAcceptDate(DateUtil.getCurrentDateTime());
        upProAccept.setAcceptDocNo("");
        upProAccept.setAddress(activity.getAddress());
        upProAccept.setApplyDate(DateUtil.convertDateToString(activity.getCreateOn(),DateUtil.FORMAT1));
        upProAccept.setApplyType("2");
        upProAccept.setApplyerName(user.getContractorOrg().getName());
        upProAccept.setApplyerPageCode(user.getContractorOrg().getOrganizationCode());
        upProAccept.setApplyerPageType("001");
        upProAccept.setApplyerType("2");
        Long areaId = activity.getArea() != null ? activity.getArea().getOid() : activity.getCity().getOid();
        upProAccept.setAreaId(Area.getValues(String.valueOf(areaId)));
        upProAccept.setCatalogCode("376263d0-f3d8-44fe-beab-a10755e60e0e");
        upProAccept.setCdBatch(cdBatch);
        upProAccept.setCdOperation("I");
        upProAccept.setCdTime(DateUtil.getCurrentDateTime());
        upProAccept.setContractCode("");
        upProAccept.setContractMobile(user.getPhone());
        upProAccept.setContractName(user.getRealName());
        upProAccept.setContractType("");
        upProAccept.setDataSource("nxhzzzqgat_dxhdaqglxxxt");
        upProAccept.setEnterpriseName(user.getContractorOrg().getName());
        upProAccept.setHandleUserName("");
        upProAccept.setIsItemBase("1");
        upProAccept.setLegal(user.getRealName());
        upProAccept.setLocalCatalogCode("");
        upProAccept.setLocalItemCode("376263d0-f3d8-44fe-beab-a10755e60e0e");
        upProAccept.setLocalProjectNo(activity.getActivityNo());
        upProAccept.setLocalTaskCode("376263d0-f3d8-44fe-beab-a10755e60e0e");
        upProAccept.setOrgCode(Area.getOCodes(String.valueOf(areaId)));
        upProAccept.setOrgName(Area.getNames(String.valueOf(areaId)));
        upProAccept.setProjectName(activity.getName());
        upProAccept.setProjectNo(activity.getActivityNo());
        upProAccept.setProjectType("1");
        upProAccept.setPromiseDate(DateUtil.convertDateToString(DateUtil.addDay(activity.getCreateOn(),30),DateUtil.FORMAT1));
        upProAccept.setPromiseTime("30");
        upProAccept.setRowGuid(activity.getActivityNo()+"_"+activity.getOid());
        upProAccept.setTaskCode("376263d0-f3d8-44fe-beab-a10755e60e0e");
        upProAccept.setTaskName("大型群众性活动安全许可");
        upProAccept.setTaskVersion("1.0");
        upProAccept.setZipCode("");
        upProAccept.setTaskHandleItem("376263d0-f3d8-44fe-beab-a10755e60e0e");
        upProAccept.setCompanyCode("1");
        upProAccept.setHandleUserId("");
        upProAccept.setFileId("376263d0-f3d8-44fe-beab-a10755e60e0e");
        upProAccept.setPcc("5");
        upProAccept.setSys_name("大型活动安全管理信息系统");
        upProAccept.setSys_lev("1");
        upProAccept.setModel_id("376263d0-f3d8-44fe-beab-a10755e60e0e");
        return upProAccept;
    }
    private List<UpProProcess> setUpProProcessList(Activity activity){
        List<ActivityApproval> approveList = activityApprovalDao.findByActivityIdAndApproveStatus(activity.getOid(),"");
        String approveUnit = activityService.getApproveUnit(activity);
        List<UpProProcess> list = Lists.newArrayList();
        UpProProcess upProProcess = null;
        String startTime = DateUtil.convertDateToString(activity.getCreateOn(),DateUtil.FORMAT1);
        for(ActivityApproval approve : approveList){
            upProProcess = new UpProProcess();
            upProProcess.setCdBatch(IdUtil.simpleUUID());
            upProProcess.setCdOperation("I");
            upProProcess.setCdTime(DateUtil.getCurrentDateTime());
            upProProcess.setDataSource("nxhzzzqgat_dxhdaqglxxxt");
            upProProcess.setEventEndTime(approve.getApprovalDate());
            upProProcess.setEventName(getEventName(approve.getApprovalStatus()));
            upProProcess.setEventStartTime(startTime);
            upProProcess.setHandleExplain(approve.getComment());
            upProProcess.setHandleUserName(approveUnit);
            upProProcess.setProcessId(activity.getActivityNo()+"AL"+approve.getOid());
            upProProcess.setProcessName(getProcessName(approve.getApprovalStatus()));
            upProProcess.setProjectNo(activity.getActivityNo());
            upProProcess.setRemark("");
            upProProcess.setIsNeedService("0");
            upProProcess.setServiceName("");
            upProProcess.setServiceNumber("");
            upProProcess.setServiceTime("");
            list.add(upProProcess);
            startTime = approve.getApprovalDate();
        }
        return list;
    }
    private String getEventName(String status){
        //业务动作 1  通过2  退回9  其他
        if(status.equals("30")||status.equals("SL30")||status.equals("2")){
            return "1";
        } else if(status.equals("20")||status.equals("SL20")||status.equals("4")){
            return "2";
        }else{
            return "9";
        }
    }
    private String getProcessName(String status){
        return status.equals("10")?"初审":status.equals("20")?"初审":status.equals("30")?"初审":status.equals("SL10")?"受理":status.equals("SL20")?"受理":status.equals("SL30")?"受理":status.equals("1")?"办结":status.equals("2")?"办结":status.equals("3")?"办结":status.equals("4")?"办结":"";
    }

    private UpProResult setUpProResult(Activity activity,String cdBatch){
        List<ActivityApproval> approveList = activityApprovalDao.findByActivityIdAndApproveStatus(activity.getOid(), DictConst.APPROVALSTATUS_SHTG);
        String resultType = "1";
        String resultExplain = "批准";
        if (CollectionUtil.isEmpty(approveList)) {
            approveList = activityApprovalDao.findByActivityIdAndApproveStatus(activity.getOid(), DictConst.APPROVALSTATUS_SHBTG);
            resultType = "0";
            resultExplain = "不予批准";
        }
        String approveUnit = activityService.getApproveUnit(activity);
        if(approveList.size()==0){
            return new UpProResult();
        }
        ActivityApproval approval = approveList.get(0);
        UpProResult upProResult = new UpProResult();
        upProResult.setCdBatch(cdBatch);
        upProResult.setCdOperation("I");
        upProResult.setCdTime(DateUtil.getCurrentDateTime());
        upProResult.setDataSource("nxhzzzqgat_dxhdaqglxxxt");
        upProResult.setHandleUserName(approveUnit);
        upProResult.setIsDeliveryResults("0");
        upProResult.setProjectNo(activity.getActivityNo());
        upProResult.setRemark(approval.getComment());
        upProResult.setResultCertName("");
        upProResult.setResultCetrNo("");
        upProResult.setResultDate(approval.getApprovalDate());
        upProResult.setResultExplain(resultExplain);
        upProResult.setResultType(resultType);
        upProResult.setRowGuid(activity.getActivityNo()+"_"+activity.getOid());
        upProResult.setSatisfaction("");
        return upProResult;
    }
    private List<UpProMaterial> setUpProMaterialList(Activity activity){
        UpProMaterial upProMaterial = null;
        List<UpProMaterial> list = Lists.newArrayList();
        List<ActivityMaterial> materialList = activityMaterialDao.findActivityMaterialByActivity(activity);
        for (ActivityMaterial activityMaterial:materialList) {
            String url = activityMaterial.getValue();
            url = url.startsWith("http")?url: SysBasicUtil.getConfig("web_url")+url;
            upProMaterial = new UpProMaterial();
            upProMaterial.setCdBatch(IdUtil.simpleUUID());
            upProMaterial.setCdOperation("I");
            upProMaterial.setCdTime(DateUtil.getCurrentDateTime());
            upProMaterial.setDataSource("nxhzzzqgat_dxhdaqglxxxt");
            upProMaterial.setGetNum("");
            upProMaterial.setGetType("2");
            upProMaterial.setMaterialAttachName(url.substring(url.lastIndexOf("/")+1));
            upProMaterial.setMaterialName(getMaterialName(activityMaterial.getActivityMaterialType()));
            upProMaterial.setProjectNo(activity.getActivityNo());
            upProMaterial.setRemark(activityMaterial.getComment());
            upProMaterial.setRowGuid(activity.getActivityNo()+"_"+activity.getOid());
            upProMaterial.setUrl(url);
            list.add(upProMaterial);
        }
        return list;
    }

    private String getMaterialName(String type){
        return type.equals(DictConst.ACTIVITYMATERIALTYPE_PGBG)?"评估报告":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_PGBG_GEN)?"评估报告":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_DZBD)?"电子保单":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_JLBG_KS)?"监理报告（活动开始前）":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_JLBG_JS)?"监理报告（活动结束后）":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_DYJDTKBG)?"第一阶段勘查报告":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_DEJDTKBG)?"第二阶段勘查报告":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_DSJDTKBG)?"第三阶段勘查报告":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_PGCL)?"评估材料":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_BPCL)?"报批材料":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_BPCL_OLD)?"报批材料":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_FKLSCL)?"风险控制落实说明材料":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_AQGZFA)?"安全工作方案":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_SFZM)?"身份证明，资质证明":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_HDFA)?"活动方案说明":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_HDCSZM)?"活动场所证明":
                type.equals(DictConst.ACTIVITYMATERIALTYPE_CBZZM)?"承办者身份证明":"";
    }

    private List<UpProSpecialProcedure> setUpProSpecialProcedureList(Activity activity,String cdBatch){
        return Lists.newArrayList();
    }

    private String getToken(){
        JSONObject json = new JSONObject();
        json.put("clientId",ConfigResources.NX_CLIENTID);
        json.put("secretId", SMEncryptUtil.sm3Encrypt(ConfigResources.NX_SECRETID));
        json.put("timestamp",System.currentTimeMillis()+"");
        String ret = HttpUtil.post(ConfigResources.NX_QUERY_URL+"res_token",json.toJSONString());
        if(StringUtils.isNotEmpty(ret)){
            ResultNX result = JSONObject.parseObject(ret,ResultNX.class);
            if(result.getCode()==200&&result.getData()!=null){
                return result.getData().getToken();
            }
        }
        return "";
    }

    public static void main(String[] args) {
        /*JSONObject json = new JSONObject();
        json.put("clientId",clientId);
        json.put("secretId",secretId);
        json.put("timestamp",System.currentTimeMillis()+"");
        String ret = HttpUtil.post(apiUrl+"res_token",json.toJSONString());
        if(StringUtils.isNotEmpty(ret)){
            ResultNX result = JSONObject.parseObject(ret,ResultNX.class);
            if(result.getCode()==200&&result.getData()!=null){
                System.out.println(result.getData().getToken());
                return;
            }
        }*/
        /*String fName = "/getResource.do?path=zhejiang/2019-10-28/hd/_act_16_t_20191028154007428.zip";
        String  fileName = fName.substring(fName.lastIndexOf("/")+1);
        System.out.println(fileName);*/
        JSONObject json = new JSONObject();
        json.put("clientId","");
        json.put("secretId", SMEncryptUtil.sm3Encrypt(""));
        json.put("timestamp",System.currentTimeMillis()+"");
        System.out.println(json.toJSONString());
    }
}
