package com.boco.nbd.wios.manage;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.boco.nbd.cams.core.constant.CamsConstant;
import com.boco.nbd.cams.core.util.LambdaUtils;
import com.boco.nbd.framework.workflow.entity.GetTaskRequest;
import com.boco.nbd.framework.workflow.entity.SubmitTypeEnum;
import com.boco.nbd.framework.workflow.entity.constant.FlowConstants;
import com.boco.nbd.wios.export.Contants;
import com.boco.nbd.wios.flow.entity.bo.LocalSubmitFlowBO;
import com.boco.nbd.wios.flow.entity.po.OrderPO;
import com.boco.nbd.wios.flow.entity.po.OrderSurveyPO;
import com.boco.nbd.wios.flow.entity.qo.CamsOrderQo;
import com.boco.nbd.wios.flow.entity.vo.OrderInstallItemVO;
import com.boco.nbd.wios.flow.entity.vo.RegionInfoVO;
import com.boco.nbd.wios.flow.enums.FlowNodeEnum;
import com.boco.nbd.wios.flow.enums.RgbEnum;
import com.boco.nbd.wios.flow.util.ProcessUtil;
import com.boco.nbd.wios.manage.entity.bo.OemContractBo;
import com.boco.nbd.wios.manage.entity.bo.OemContractItemVo;
import com.boco.nbd.wios.manage.entity.bo.OrderInstallItem;
import com.boco.nbd.wios.manage.entity.cams.enums.OrderStatus;
import com.boco.nbd.wios.manage.entity.common.bo.UploadFile;
import com.boco.nbd.wios.manage.enums.WareHouseOrderEnum;
import com.boco.nbd.wios.manage.util.NumberUtil;
import com.deepoove.poi.data.HyperLinkTextRenderData;
import com.deepoove.poi.data.PictureRenderData;
import org.junit.Test;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;

/**
 * @author:cao hai
 * @date:2022/6/13 18:16
 * @version:V1.0
 * @description:TODO SimpleTest
 * @modify:
 */
public class SimpleTest {


    /**
     * 超链接数据
     */
    @Test
    public void hyperLinkRenderData() {
        String a = "[{\"name\":\"9e18d3d3-b4e0-426b-9e99-0144ea87de6d.PNG\",\"url\":\"https://oss-cams.oss-cn-hangzhou.aliyuncs.com/wios/9e18d3d3-b4e0-426b-9e99-0144ea87de6d.PNG\",\"type\":1,\"useType\":\"101\"},{\"name\":\"6f81281e-f59f-4741-b8c0-c2127e09ce5a.PNG\",\"url\":\"https://oss-cams.oss-cn-hangzhou.aliyuncs.com/wios/6f81281e-f59f-4741-b8c0-c2127e09ce5a.PNG\",\"type\":1,\"useType\":\"102\"},{\"name\":\"15a91790-5dd7-41ee-bdd0-f74372dfcbdf.PNG\",\"url\":\"https://oss-cams.oss-cn-hangzhou.aliyuncs.com/wios/15a91790-5dd7-41ee-bdd0-f74372dfcbdf.PNG\",\"type\":1,\"useType\":\"111\"},{\"name\":\"08757330-d5fc-4de9-9a70-ab38f96ad140.PNG\",\"url\":\"https://oss-cams.oss-cn-hangzhou.aliyuncs.com/wios/08757330-d5fc-4de9-9a70-ab38f96ad140.PNG\",\"type\":1,\"useType\":\"112\"},{\"name\":\"4496b719-4caf-48e2-86e4-5cb8c456dbe1.PNG\",\"url\":\"https://oss-cams.oss-cn-hangzhou.aliyuncs.com/wios/4496b719-4caf-48e2-86e4-5cb8c456dbe1.PNG\",\"type\":1,\"useType\":\"113\"},{\"name\":\"9b631567-7346-46a7-9d3a-13b38733a461.PNG\",\"url\":\"https://oss-cams.oss-cn-hangzhou.aliyuncs.com/wios/9b631567-7346-46a7-9d3a-13b38733a461.PNG\",\"type\":1,\"useType\":\"114\"}],";
        System.out.println(a.length());
        PictureRenderData picJpg = ProcessUtil.pictureRenderData("https://app-ccchong-com.oss-cn-qingdao.aliyuncs.com/wios/01b556c5-f55c-4fc2-9314-318540caabb0.JPG");
        PictureRenderData picPng = ProcessUtil.pictureRenderData("https://img1.bdstatic.com/static/common/img/icon_cf1b905.png");
        HyperLinkTextRenderData TxtPdf = ProcessUtil.hyperLinkTextRenderData("1-CAMS墙盒安装服务勘测报告(奥迪)V1.pdf", "https://app-ccchong-com.oss-cn-qingdao.aliyuncs.com/wios/9f46cb54-2db4-4c52-9260-dd6e4454d59f.PDF");
        HyperLinkTextRenderData TxtConf = ProcessUtil.hyperLinkTextRenderData("nginx.conf", "https://oss-cams.oss-cn-hangzhou.aliyuncs.com/wiosec11d17d-9f41-4f71-b0b9-d7cc6ffec81f.CONF");
        System.out.println(picJpg);
        System.out.println(picPng);
        System.out.println(TxtPdf);
        System.out.println(TxtConf);
    }


    @Test
    public void testCreateGetTaskRequest() {
        WareHouseOrderEnum orderEnum = EnumUtil.likeValueOf(WareHouseOrderEnum.class, 2);
        System.out.println(orderEnum);
        CamsOrderQo qo = new CamsOrderQo();
        qo.setPageSize(20);
        qo.setIsPaged(true);
        qo.setPageIndex(1);
        qo.setNext(FlowNodeEnum.NODE_103.getKey() + CamsConstant.COMMA + FlowNodeEnum.NODE_104.getKey() + CamsConstant.COMMA + FlowNodeEnum.NODE_105.getKey()
                + CamsConstant.COMMA + FlowNodeEnum.NODE_106.getKey());
        GetTaskRequest request = CamsOrderQo.toDo(qo);
        System.out.println(request);
    }

    @Test
    public void testJsonHandle() {
        String invoiceJson = "[{\"orderId\":\"CA20220926132626\",\"packageDeviceInvoiceStatus\":\"1\",\"packageDeviceInvoiceDate\":\"2022-09-26\",\"packageDeviceInvoiceNumber\":\"14725812\",\"packageDeviceReceiveStatus\":\"1\",\"packageDeviceFeeWithTax\":\"1880\",\"packageDeviceTax\":\"118\",\"packageInstallInvoiceStatus\":\"1\",\"packageInstallInvoiceDate\":\"2022-09-26\",\"packageInstallInvoiceNumber\":\"12887414\",\"packageInstallReceiveStatus\":\"1\",\"packageInstallFeeWithTax\":\"150\",\"packageInstallTax\":\"23\",\"submitItem\":\"3\"}]";
        List<JSONObject> list = ProcessUtil.jsonHandle(invoiceJson);
        System.out.println(list.size());
        String files = "[{\"name\":\"nginx.conf\",\"type\":11,\"useType\":111,\"url\":\"2fad99c6-35b6-4554-91e8-e463dbc4c0a4.CONF\"}]";
        Map<String, Object> formData = new HashMap<>(1);
        formData.put("files", "files");

        if (CollUtil.isNotEmpty(formData) && formData.containsKey("files")) {
            List<UploadFile> fileList = UploadFile.jsonHandle(files, true);
            Assert.isTrue(fileList.size() == 1);
        }


        String jsonStr = "[{\"id\":48,\"contractId\":\"19\",\"itemId\":\"4beb76d9-f5c8-4eb0-8b12-b0adaf4e2e4f\",\"type\":\"3\",\"price\":100,\"taxRate\":1,\"ratePrice\":101,\"description\":null,\"createAccount\":null,\"createTime\":null,\"modifyAccount\":null,\"modifyTime\":null,\"itemName\":\"壁挂交流充电桩\",\"itemCode\":\"HCCPAJS0001\",\"itemModel\":\"7kW\",\"key\":\"cd48\"},{\"id\":49,\"contractId\":\"19\",\"itemId\":\"e22e54f1-42ef-4f55-b387-fbdf3f1ff876\",\"type\":\"3\",\"price\":198.02,\"taxRate\":1,\"ratePrice\":200,\"description\":null,\"createAccount\":null,\"createTime\":null,\"modifyAccount\":null,\"modifyTime\":null,\"itemName\":\"开迈斯30KW小直流充电桩-CAMS-1-D I 0300 1 34-A/\",\"itemCode\":\"D0103000001\",\"itemModel\":\"TEST\",\"key\":\"cd49\"},{\"id\":50,\"contractId\":\"19\",\"itemId\":\"3bc8d7c1-d484-47ef-a16c-ee60a0a003f5\",\"type\":\"3\",\"price\":300,\"taxRate\":0,\"ratePrice\":300,\"description\":null,\"createAccount\":null,\"createTime\":null,\"modifyAccount\":null,\"modifyTime\":null,\"itemName\":\"7kW交流桩(互联网二代)-CAMS-1-A I 0070 1 21-C\",\"itemCode\":\"A0100700003\",\"itemModel\":\"TEST\",\"key\":\"cd50\"},{\"id\":51,\"contractId\":\"19\",\"itemId\":\"e4d0c4b4-3a18-4504-8e3c-c432c365567b\",\"type\":\"3\",\"price\":1376.15,\"taxRate\":9,\"ratePrice\":1500,\"description\":null,\"createAccount\":null,\"createTime\":null,\"modifyAccount\":null,\"modifyTime\":null,\"itemName\":\"开迈斯120KW双枪一体式充电桩\\\"(TEST)\",\"itemCode\":\"A0100700002\",\"itemModel\":\"G31\",\"key\":\"cd51\"},{\"id\":52,\"contractId\":\"19\",\"itemId\":\"04b34777-9969-4836-85db-8c0220e69dff\",\"type\":\"2\",\"price\":100,\"taxRate\":1,\"ratePrice\":101,\"description\":null,\"createAccount\":null,\"createTime\":null,\"modifyAccount\":null,\"modifyTime\":null,\"itemName\":\"三芯电缆\",\"itemCode\":\"CM00003\",\"itemModel\":\"6平方\",\"key\":\"zx52\"},{\"key\":\"zx1\",\"type\":\"4\",\"itemModel\":\"高价值辅材-ABB-漏保2p-ABB-GSH204-A-C40/0.03\",\"itemCode\":\"HCFCGJZ0005\",\"itemName\":\"安装漏电开关\",\"taxRate\":\"6\",\"price\":\"44\",\"ratePrice\":\"46.64\",\"description\":\"111\",\"itemId\":\"a33e2e4b-c38a-4a8c-bb1d-25830cd5bc4c\"},{\"key\":\"zx2\",\"type\":\"4\",\"itemModel\":\"高价值辅材-单项电表40A\",\"itemCode\":\"HCFCGJZ0009\",\"itemName\":\"安装单项电表\",\"taxRate\":\"4\",\"price\":\"34\",\"ratePrice\":\"35.36\",\"description\":\"333\",\"itemId\":\"e493a0a0-e885-475b-9945-83d9ec3618f2\"}]";
        OemContractBo bo = new OemContractBo();
        bo.setItemsJson(jsonStr);

        String str = "[{\"itemType\":4,\"fee\":\"652.30\",\"taxRate\":9,\"qunatity\":11,\"itemName\":\"大众7.2kW品牌墙盒、CAMS-2-A I 0072 1 21-A(已停用)\",\"itemModel\":\"7.2kw\",\"price\":54.4,\"contractItemId\":359,\"ratePrice\":59.3,\"areSelect\":false}]";
        List<OrderInstallItem> itemList = OrderInstallItem.wiosJsonHandle(str);
        List<OrderInstallItem> items = OrderInstallItem.jsonHandle(str);
        Assert.isTrue(itemList.size() == items.size());
        System.out.println(ProcessUtil.jsonHandle(str));
    }

    @Test
    public void testCopyProperties() {
        OemContractItemVo vo = new OemContractItemVo();
        vo.setId(38);
        vo.setContractId("15");
        vo.setItemId("04b34777-9969-4836-85db-8c0220e69dff");
        vo.setType("2");
        vo.setPrice(new BigDecimal(100));
        vo.setTaxRate(new BigDecimal(1));
        vo.setRatePrice(new BigDecimal(101));
        vo.setItemName("三芯电缆");
        vo.setItemModel("6平方");
        vo.setItemCode("CM00003");
        OrderInstallItemVO result = vo.toVo();
        System.out.println(result);

        OrderPO po = new OrderPO();
        po.setRegionId("12");
        po.setId("DDDD");
        RegionInfoVO infoVO = new RegionInfoVO();
        infoVO.setCountryId(1);
        infoVO.setCountryName("全国");
        infoVO.setAreaId(162);
        infoVO.setAreaName("西南地区");
        infoVO.setProvinceId(189);
        infoVO.setProvinceName("西藏自治区");
        infoVO.setRegionLevel(3);
        BeanUtil.copyProperties(infoVO, po, true);
        System.out.println(po);
    }

    /**
     * 超时rgb测试
     */
    @Test
    public void testGetOverTimeRgb() {
        Date time1 = DateUtil.parse("2022-08-03 09:06:19", DatePattern.NORM_DATETIME_PATTERN);
        Date time2 = DateUtil.parse("2022-08-03 10:36:19", DatePattern.NORM_DATETIME_PATTERN);
        Date time3 = DateUtil.parse("2022-08-03 10:56:19", DatePattern.NORM_DATETIME_PATTERN);
        System.out.println(RgbEnum.getOverTimeRgb(time1, time2));
        System.out.println(RgbEnum.getOverTimeRgb(time2, time3));
        System.out.println(RgbEnum.getOverTimeRgb(time1, time3));
    }

    @Test
    public void testExport() throws NoSuchFieldException, IllegalAccessException {
        String serviceName = "order";
        Contants contants = new Contants();
        Field field = Contants.class.getDeclaredField("export_" + serviceName + "_field");
        String fieldStr = field.get(contants).toString();
        Assert.notNull(fieldStr);
        Field title = Contants.class.getDeclaredField("export_" + serviceName + "_title");
        String titleStr = title.get(contants).toString();
        String[][] titleArray = new String[][]{titleStr.split(CamsConstant.COMMA)};
        Assert.notNull(titleArray);
    }

    @Test
    public void testGetOrderStatus() {
        LocalSubmitFlowBO bo = new LocalSubmitFlowBO();
        bo.setCurrentNode(105);
        bo.setSubmitType(SubmitTypeEnum.TaskFlow);
        bo.setWorkId("CA20220805100210");
        bo.setTaskId("b1af594a-1463-11ed-957f-5254000b734e");
        Map<String, Object> formData = new HashMap<>(12);
        String jsonStr = "{\n" +
                "accessCircuitCapacity: 1,\n" +
                "address: \"江苏省常州市武进区南夏墅街道常州钢研极光增材制造有限公司武进国家高新区创新产业园\",\n" +
                "addressLat: \"31.613649\",\n" +
                "addressLng: \"119.934525\",\n" +
                "cableInstallType: 1,\n" +
                "cableMeter: 1,\n" +
                "cableType: 1,\n" +
                "houseType: 1,\n" +
                "installPosition: 1,\n" +
                "installSupplierName: null,\n" +
                "installType: 1,\n" +
                "measuredPhaseCurrent: 1,\n" +
                "measuredPhaseVoltage: 1,\n" +
                "needErectPile: 0,\n" +
                "needSpecialConstruction: 0,\n" +
                "oemAgentContactName: \"金先生\",\n" +
                "oemAgentContactPhone: \"13913912345\",\n" +
                "oemAgentName: \"无锡新丰泰\",\n" +
                "openAir: 0,\n" +
                "outOrderId: \"784874379938894\",\n" +
                "overStandard: 0,\n" +
                "packType: \"1001801\",\n" +
                "parkingCondition: 1,\n" +
                "parkingInfo: \"11111\",\n" +
                "parkingType: 1,\n" +
                "planInfo: \"11\",\n" +
                "powerType: 1,\n" +
                "prepareInfo: \"{\\\"1\\\":\\\"关于在停车位安装电工汽车充电设备的申请\\\",\\\"2\\\":\\\"停车车位产权复印件\\\"}\",\n" +
                "propertyAgree: 1,\n" +
                "propertyCompany: \"1111\",\n" +
                "propertyContact: \"1111\",\n" +
                "propertyPhone: \"18362562667\",\n" +
                "signalIntensity: 1,\n" +
                "signalType: 1,\n" +
                "surveyClientName: \"连腾飞测试8.5\",\n" +
                "surveyClientPhone: \"18367478333\",\n" +
                "surveyDate: \"2022-08-05\",\n" +
                "surveyItemModel: \"10018010101\",\n" +
                "surveyRemark: \"11\",\n" +
                "surveyResult: 1,\n" +
                "surveyStaffName: \"周鑫乐\",\n" +
                "surveyStaffPhone: \"13616108739\",\n" +
                "surveyWallboxModel: \"100180101\",\n" +
                "transformerSpecificValue: 1,\n" +
                "upperCircuitBreaker: 1,\n" +
                "upperLine: 1,\n" +
                "vehicleModel: \"suv\",\n" +
                "vehicleParkingNo: \"111111\",\n" +
                "}";
        formData = JSONUtil.toBean(jsonStr, formData.getClass());
        //prepareInfo 转map
        String fieldName = LambdaUtils.getFieldName(OrderSurveyPO::getPrepareInfo);
        formData.put(fieldName, JSONUtil.toBean(JSONUtil.parseObj(formData.get(fieldName)), HashMap.class));
        bo.setFormData(formData);
        System.out.println(formData);
        bo.localVerify();
        System.out.println(bo.getBusinessSurvey().getPrepareInfo());
        OrderStatus status = FlowNodeEnum.getOrderStatus(SubmitTypeEnum.TaskFlow, FlowNodeEnum.NODE_101, FlowNodeEnum.NODE_102);
        System.out.println(status);
    }

    @Test
    public void testFillBeanWithMap() {
        Map<String, Object> formDate = new HashMap<>(1);
        List<Map<String, Object>> items = new ArrayList<>(1);
        Map<String, Object> data = new HashMap<>(1);
        data.put("1", 23);
        items.add(data);
        formDate.put(LambdaUtils.getFieldName(OrderPO::getItemFees), data);
        formDate.put(LambdaUtils.getFieldName(OrderPO::getItemHighAdd), items);
        OrderPO po = ProcessUtil.fillBeanWithMap(formDate, OrderPO.class);
        System.out.println(po.getItemFees());
        System.out.println(po.getItemHighAdd());
        org.junit.Assert.assertTrue(po.getItemFees() != null);
    }

    /**
     * 测试分割
     */
    @Test
    public void testSplit() {
        org.junit.Assert.assertTrue(ProcessUtil.EMPTY_PATTERN.matcher("{}").matches());
        org.junit.Assert.assertTrue(ProcessUtil.EMPTY_PATTERN.matcher("[{}]").matches());

        LocalSubmitFlowBO bo = new LocalSubmitFlowBO();
        bo.setBusiness(new OrderPO());
        System.out.println(ProcessUtil.compare(bo.getBusiness().getElectricExpand(), 1));

        String item = "1-室内";
        int firstIndex = item.indexOf(CamsConstant.DASH_FLAG);
        if (firstIndex == -1) {
            firstIndex = item.length();
        }
        String str1 = item.substring(0, firstIndex);
        String str2 = item.length() == firstIndex ? str1 : item.substring(firstIndex + 1);
        System.out.println(str1);
        System.out.println(str2);
    }

    @Test
    public void testCamsOrderQoToDo() {
        CamsOrderQo qo = new CamsOrderQo();
        qo.setUserName("TEST");
        qo.setId("12345");
        qo.setUserId("123");
        qo.setRegionId("1,2,3");
        qo.setStatus("1,2,3");
        qo.setSurveyFinishTime("2022-07-20 11:12:26" + FlowConstants.SEMICOLON + "2022-07-25 11:12:26");
        qo.setScoreGt(1F);
        qo.setPageSize(20);
        GetTaskRequest request = CamsOrderQo.toDo(qo);
        System.out.println(request);
    }

    @Test
    public void testLambdaUtils() {
        System.out.println(LambdaUtils.getFieldName(OrderPO::getId));
        System.out.println(LambdaUtils.getFieldApiModelProperty(OrderPO::getId));
    }

    @Test
    public void testMapToObject() {
        Map<String, Object> formData = new HashMap<>(2);
        formData.put("parkingCondition", "1");
        formData.put("surveyReserveTime", "2022-07-20 11:12:26");
        OrderPO po = new OrderPO();
        BeanUtil.fillBeanWithMap(formData, po, true);
        //BeanUtil.mapToObject 转换时间类型存在问题
        System.out.println(po);
    }

    @Test
    public void testCreateWorkId() {
        System.out.println("CA" + NumberUtil.getRandomOrderId(7));
    }


    /**
     * 4月30日~5月4日4月24日(周日)、5月7日(周六)
     */
    @Test
    public void testGetDueStartData() {
        Map<String, List<String>> map = new HashMap<>(2);
        String[] holiday = {"2022-04-30", "2022-05-01", "2022-05-02", "2022-05-03", "2022-05-04"};
        String[] work = {"2022-04-24", "2022-05-07"};
        map.put(ProcessUtil.HOLIDAY_TYPE, Arrays.asList(holiday));
        map.put(ProcessUtil.WORK_TYPE, Arrays.asList(work));
        Date time1 = DateUtil.parse("2022-04-22 08:59:59", DatePattern.NORM_DATETIME_PATTERN);
        System.out.println(DateUtil.format(ProcessUtil.offsetHour(time1, 24, map), DatePattern.NORM_DATETIME_PATTERN));
        Date time2 = DateUtil.parse("2022-04-29 09:30:00", DatePattern.NORM_DATETIME_PATTERN);
        System.out.println(DateUtil.format(ProcessUtil.offsetDay(time2, 1, map), DatePattern.NORM_DATETIME_PATTERN));
        Date time3 = DateUtil.parse("2022-04-29 18:30:00", DatePattern.NORM_DATETIME_PATTERN);
        System.out.println(DateUtil.format(ProcessUtil.offsetDay(time3, 1, map), DatePattern.NORM_DATETIME_PATTERN));
    }
}