package com.unissoft.model;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.chinaitop.depot.intelligent.utils.DateUtils;
import com.chinaitop.depot.intelligent.wsClient.WebServiceSer;
import com.chinaitop.depot.intelligent.wsClient.WebServiceSerSoap;
import com.chinaitop.depot.intelligent.wsClientJc.jc3.MyWebService;
import com.chinaitop.depot.intelligent.wsClientJc.jc3.MyWebServiceSoap;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.assertj.core.util.Lists;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author qingsong.han
 * @description: webService推送数据包装类
 * @create 2019-03-07 16:03
 */
public class SendEntity<T> implements Serializable {

    // 序列化反序列化验证标识
    private static final long serialVersionUID = 8958153190662408246L;
    // 常量标识 插入: "I", 更新: "U", 删除: "D"
    private static final String INSERT = "I";
    private static final String UPDATE = "U";
    private static final String DELETE = "D";

    // 标记: 插入: "I", 更新: "U", 删除: "D"
    private String state;
    // 接收包装参数
    private T data;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    /**
     * 参数封装
     *
     * @param state 标识
     * @param data  传入参数值
     * @param <T>
     * @return
     */
    private static <T> SendEntity<T> buildSend(String state, T data) {
        SendEntity<T> sendEntity = new SendEntity<T>();
        sendEntity.state = state;
        sendEntity.data = data;
        return sendEntity;
    }

    /**
     * 插入时封装
     *
     * @param data 传入参数
     * @param <T>
     * @return
     */
    public static <T> SendEntity<T> insertConvert(T data) {
        return buildSend(SendEntity.INSERT, data);
    }

    /**
     * 更新时封装
     *
     * @param data 传入参数
     * @param <T>
     * @return
     */
    public static <T> SendEntity<T> updateConvert(T data) {
        return buildSend(SendEntity.UPDATE, data);
    }

    /**
     * 删除时封装
     *
     * @param data 传入参数
     * @param <T>
     * @return
     */
    public static <T> SendEntity<T> deleteConvert(T data) {
        return buildSend(SendEntity.DELETE, data);
    }

    /**
     * 推送数据转换并发送webservice数据
     *
     * @param data 传入参数
     * @param type 类型: 插入: "I", 更新: "U", 删除: "D"
     * @param <T>  声明类型规范
     */
    public static <T> String sendAndConvert(T data, T type) {
        // 封装推送数据为数组格式
        ArrayList<SendEntity> dataList = null;
        if (data != null && type != null) {
            if ("I".equals(type))
                dataList = Lists.newArrayList(insertConvert(data));
            else if ("D".equals(type))
                dataList = Lists.newArrayList(deleteConvert(data));
            else if ("U".equals(type))
                dataList = Lists.newArrayList(updateConvert(data));
            else
                return "参数类型必须为I,U,D";
            try {
                // 创建json转换对象
                ObjectMapper objectMapper = new ObjectMapper();
                // 对象转json字符串
                String jsonStr = objectMapper.writeValueAsString(dataList);
                return jsonStr;
            } catch (Exception e) {
                e.printStackTrace();
                return "转换失败";
            }
        } else {
            return "参数不能为空";
        }
    }

    // webservice工厂
    public static WebServiceSerSoap cxfFactor(){
        // webService对象
        WebServiceSer webs = new WebServiceSer();
        // 获取cxf代理
        WebServiceSerSoap factor = webs.getWebServiceSerSoap();
        return factor;
    }


    /**
     * 针对现有数据对接处理交互数据
     *
     * @param jsonStr json字符串参数
     * @return
     */
    public static JSONObject synchronizationConvert(String jsonStr) {
        // json字符串转json对象
        JSONObject jsonObject = JSON.parseObject(jsonStr);
        // 移除不许要的属性
        jsonObject.remove("id");
        jsonObject.remove("orgId");
        return jsonObject;
    }

    /**
     * 能耗电表数据-数据字段未修改,修改后可以删除
     * @param energyJson
     * @return
     */
    @SuppressWarnings("ALL")
    public static String energyData(String energyJson, String CUD, Date date, String str){
        // json字符串转json对象
        JSONObject jsonObject = JSON.parseObject(energyJson);
        // 封装推送数据
        Map<String, Object> map = new HashMap<>();
        if (CUD.equals("I")) {
            map.put("vdevcode",str); // 设备编码
        } else {
            map.put("vdevcode",jsonObject.get("vNhCode")); // 设备编码
        }
        map.put("vdevname",jsonObject.get("vNhName")); // 设备名称
        map.put("idevtdh",jsonObject.get("iTdh")); // 通道号
        map.put("sitecode",jsonObject.get("vZdCode")); // 站点编码
        map.put("vcfcode",jsonObject.get("vCfCode")); // 仓房编码
        map.put("vnhtype",jsonObject.get("vHhtype")); // 能耗类型
        map.put("totalpower",jsonObject.get("fTotalNh")); // 累计功率
        map.put("voltage",jsonObject.get("fVoltage")); // 电压
        map.put("electric",jsonObject.get("fElectric")); // 电流
        map.put("remark",jsonObject.get("vRemark")); // 备注
        if (CUD.equals("D")){
            map.put("updatetime",jsonObject.get("vUpdateTime")); // 更新时间
        } else {
            map.put("updatetime",DateUtils.dateToString(date)); // 更新时间
        }
        // 封装推送数据为数组格式
        return sendAndConvert(map,CUD);
    }

    //数量检测ws3版本调用方法
    public static MyWebServiceSoap myWebService3(){
        // webService对象
        MyWebServiceSoap myWebService3 = new MyWebService().getMyWebServiceSoap();
        return myWebService3;
    }
    //数量检测ws2版本调用方法
    public static com.chinaitop.depot.intelligent.wsClientJc.jc2.MyWebServiceSoap myWebService2(){
        // webService对象
        com.chinaitop.depot.intelligent.wsClientJc.jc2.MyWebServiceSoap myWebService2 = new com.chinaitop.depot.intelligent.wsClientJc.jc2.MyWebService().getMyWebServiceSoap();
        return myWebService2;
    }
}
