package com.casic.missiles.utils;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.constAcal.RecordExcelDataRequest;
import com.casic.missiles.dto.constAcal.UnsyncRecordMessageRequest;
import com.casic.missiles.enums.constAcal.ConstDeviceType;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

import static com.casic.missiles.enums.constAcal.ConstUri.*;

/**
 * @Description: 请求Const康斯特接口工具
 * @Author: wangpeng
 * @Date: 2024/9/26 9:43
 */
public class ConstUtil {
    @Resource
    private RestTemplate restTemplate;

    String ipPort = "http://127.0.0.1:8600";

    /**
     * 登录
     * @return ApiKey
     */
    public String login() {
        Map map = new HashMap<>();
        //账号密码配置现场实际唯一一台安装电脑安装的const软件登录账号密码
        map.put("AccountID", "admin");
        map.put("Password", "admin");
        JSONObject responseJson = restTemplate.postForObject(ipPort + LOG_IN, map, JSONObject.class);
        Integer statusCode = responseJson.getInteger("StatusCode");
        if (0 == statusCode) {
            return responseJson.getString("ApiKey");
        }
        return null;
    }

    /**
     * 未同步检定数据列表
     * @param request
     * @return List<Object>
     */
    public String unsyncRecordMessage(UnsyncRecordMessageRequest request) {
        JSONObject responseJson = constStatusCode(BeanUtil.beanToMap(request), UNSYNC_RECORD_MESSAGE);
        Integer statusCode = responseJson.getInteger("StatusCode");
        if (0 == statusCode) {
            JSONArray reports = responseJson.getJSONArray("Reports");
            reports.forEach(report -> {
                JSONObject dataObject = (JSONObject)report;
                Integer dutTypeID = dataObject.getInteger("DUTTypeID");
                JSONObject data = dataObject.getJSONObject("Data");
                JSONObject baseInfo = data.getJSONObject("BaseInfo");
                //基础数据获取
                String deviceModel = baseInfo.getString("B8");
                String deviceManufactureNo = baseInfo.getString("B10");
                String deviceManufacturer = baseInfo.getString("B16");
                String orderNo = baseInfo.getString("B14");

                String measureCategory = baseInfo.getString("U4"); //业务类别/证书类别（检定/校准/测试），对应业务系统检校类别字段
                String measureDate = baseInfo.getString("G10"); //检定日期，格式"2024/9/24 11:23:36"
                String conclusion = baseInfo.getString("G28"); //检定结论（合格/不合格）
                String measureValidDate = baseInfo.getString("G20"); //检定有效期，格式"2024/9/24 11:23:36"

//                检定数据《标准装置设备):设各名称、规格型号、出厂编号、不确定度或允许误差极限或准确度等级、检定有效期
//                匹配规则:设备名称、规格型号、出厂编号，匹配到了关联到系统中标准设备，匹配不到就是文本存储，仅做展示不建立关系)
//                文件:原始记录、检定证书
                String equipmentNo = baseInfo.getString("K35"); //标准设备编号（即业务系统中出厂编号）
                String equipmentModel = baseInfo.getString("K39"); //标准设备规格型号
                String equipmentName = baseInfo.getString("K33"); //标准设备名称
                String equipmentMeasureRange = baseInfo.getString("K47"); //标准设备测量范围
                String equipmentUncertainty = baseInfo.getString("K49"); //标准设备准确度等级（即不确定度或允许误差极限或准确度等级）
                String equipmentMeasureValidDate = baseInfo.getString("K43"); //标准设备检定有效期

                //将上述字段构建为实体返回，调用该接口的位置将返回实体进行后续匹配等逻辑处理

                //若需要检定数据，需要按不同类别进行获取及存储数据
                if (dutTypeID == ConstDeviceType.POINTER_PRESSURE_GAUGE) {

                } else if (dutTypeID == ConstDeviceType.ELECTRIC_CONTACT_PRESSURE_GAUGE) {

                } else if (dutTypeID == ConstDeviceType.PRECISION_POINTER_PRESSURE_GAUGE) {

                }

            });
        }
        return null;
    }

    /**
     * 更新数据同步状态
     * @param request
     * @return "success"/"fail"
     */
    public String updateSyncStatus(UnsyncRecordMessageRequest request) {
        JSONObject responseJson = constStatusCode(BeanUtil.beanToMap(request), UPDATE_SYNC_STATUS);
        Integer statusCode = responseJson.getInteger("StatusCode");
        if (0 == statusCode) {
            return "success";
        }
        return "fail";
    }

    /**
     * 获取原始记录Excel数据
     * @param request
     * @return Excel文件字节数组进行Base64编码后的字符串
     * 1.压缩：GZIP压缩字节数组
     * 2.压缩状态：Uncompressed（数据未压缩）；Compressed（数据已压缩）
     * 3.ExcelData：将Excel文件流的字节数组（需要压缩时，使用GZIP压缩字节数组）执行Base64编码后形成的字符串
     * 4.ExcelData创建Excel文件示例： 生成Excel文件代码示例
     * 5.DateType参数不写或值是0时（表示不查询日期），StartDate和EndDate两个参数可以不用写
     */
    public String getRecordExcelData(RecordExcelDataRequest request) {
        JSONObject responseJson = constStatusCode(BeanUtil.beanToMap(request), GET_RECORD_EXCEL_DATA);
        Integer statusCode = responseJson.getInteger("StatusCode");
        if (0 == statusCode) {
            //压缩状态
            String compressionState = responseJson.getString("CompressionState");
            //Excel记录数据（Excel文件字节数组进行Base64编码后的字符串）
            String excelData = responseJson.getString("ExcelData");
            return excelData;
        }
        return null;
    }

    /**
     * 获取检定证书Excel数据
     * @param request
     * @return Excel文件字节数组进行Base64编码后的字符串
     */
    public String getCertificateExcelData(RecordExcelDataRequest request) {
        JSONObject responseJson = constStatusCode(BeanUtil.beanToMap(request), GET_CERTIFICATE_EXCEL_DATA);
        Integer statusCode = responseJson.getInteger("StatusCode");
        if (0 == statusCode) {
            //压缩状态
            String compressionState = responseJson.getString("CompressionState");
            //Excel记录数据（Excel文件字节数组进行Base64编码后的字符串）
            String excelData = responseJson.getString("ExcelData");
            return excelData;
        }
        return null;
    }



    private JSONObject constStatusCode(Map<String, Object> map, String uri) {
        HttpHeaders headers = new HttpHeaders();
        String apiKey = this.login();
        headers.add("ApiKey", apiKey);
        JSONObject responseJson = restTemplate.postForObject(
                ipPort + uri,
                new HttpEntity<String>(headers),
                JSONObject.class,
                map);
        return responseJson;
    }
}
