package com.yfd.platform.component.nettyudpserver;
import cn.hutool.core.util.StrUtil;
import lombok.Data;

/**
 * 自定义协议包
 */
@Data
public class MyMessageProtocol {
    //类型标识（1-5）5字节  EB90EB9055
    private String  frametype;

    //站序号  (6-7) 2字节
    private short stationnum;

    //监控索引号 (8-9) 2字节
    private short monitorindex;

    //监控类型(10) 1字节  0，遥控；1，遥信；2，遥测
    private byte monitortype;

    //属性长度(11) 1字节
    private int attributelength;

    //属性(12-N)
    private String attribute;

    //值描述长度(N+1)  1字节
    private int valuelength;

    //值描述（N+2，M）
    private String value;

    //事件时标(M+1，M+1） 7个字节
    private String eventtime;

    //和校验 M+8） 1个字节
    private short sumverify;

    // 定义一个方法，将CP56格式的时间byte[]，转换为时间格式的字符串
    public static String cp56ToTimeString(byte[] cp56) {
        // 检查参数是否合法，如果不是7个字节，返回空字符串
        if (cp56 == null || cp56.length != 7) {
            return "";
        }
        // 定义一个字符串缓冲区，用来拼接结果
        StringBuilder sb = new StringBuilder();
        // 从第7个字节开始，依次解析每个字节的二进制数，根据CP56格式的规则，还原每个时间单位
        // 并将其转换为十进制数，用冒号或短横线分隔，拼接到字符串缓冲区中
        // 注意年份要加上2000，毫秒要除以1000
        sb.append(2000 + (cp56[6] & 0xFF)).append("-"); // 年
        sb.append(StrUtil.padPre(String.valueOf(Byte.toUnsignedInt(cp56[5])),2,'0')).append("-"); // 月
        sb.append(StrUtil.padPre(String.valueOf(Byte.toUnsignedInt(cp56[4])),2,'0')).append(" "); // 日
        sb.append(StrUtil.padPre(String.valueOf(Byte.toUnsignedInt(cp56[3])),2,'0')).append(":"); // 时
        sb.append(StrUtil.padPre(String.valueOf(Byte.toUnsignedInt(cp56[2])),2,'0')).append(":"); // 分
        int millisecond=0;
        millisecond=(cp56[1] & 0xFF)<<8; //将bytes[1]的低8位左移8位，作为结果的高8位
        millisecond |=(cp56[0] & 0xFF);
        String temp=String.valueOf(millisecond);
        String second=StrUtil.sub(temp,0,temp.length()-3);
        sb.append(StrUtil.padPre(second,2,'0')).append(".");
        sb.append(StrUtil.subSuf(temp,temp.length()-3) ); // 毫秒的小数部分
        // 返回字符串缓冲区的内容
        return sb.toString();
    }

    public static byte[] timeStringToCP56(String timeString) {
        // 检查参数是否合法，如果不是符合时间格式的字符串，返回空数组
        if (timeString == null || !timeString.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}")) {
            return new byte[0];
        }
        // 定义一个字节数组，用来存储结果
        byte[] cp56 = new byte[7];
        // 使用正则表达式，将时间字符串分割为年、月、日、时、分、秒和毫秒，注意年份要减去2000，毫秒要乘以1000
        String[] timeUnits = timeString.split("[- :.]");
        int year = Integer.parseInt(timeUnits[0]) - 2000;
        int month = Integer.parseInt(timeUnits[1]);
        int day = Integer.parseInt(timeUnits[2]);
        int hour = Integer.parseInt(timeUnits[3]);
        int minute = Integer.parseInt(timeUnits[4]);
        int millisecond =Integer.parseInt(timeUnits[5])* 1000 + Integer.parseInt(timeUnits[6]) ;
        // 将每个时间单位转换为二进制数，并根据CP56格式的要求，存储到字节数组中
        // 注意要使用位运算符和位掩码，保证每个字节只有8位有效位
        cp56[0] = (byte) ((millisecond) ); // 毫秒的低8位
        cp56[1] = (byte) ((millisecond >> 8)); // 毫秒的高8位
        cp56[2] = (byte) (minute & 0xFF); // 分
        cp56[3] = (byte) (hour & 0xFF); // 时
        cp56[4] = (byte) (day & 0xFF); // 星期日和日
        cp56[5] = (byte) (month & 0xFF); // 月
        cp56[6] = (byte) (year & 0xFF); // 年
        // 返回字节数组
        return cp56;
    }


}


