#pragma once

#include <string>
#include <vector>
#include <cstdint>
#include <optional>
#include <cstring>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <map>
#include <unordered_map>

// ==========================
// 🕒 32960 时间结构（用于数据单元）
// ==========================
struct TimeStamp
{
    uint8_t year;   // 年（0~99）
    uint8_t month;  // 月（1~12）
    uint8_t day;    // 日（1~31）
    uint8_t hour;   // 小时（0~23）
    uint8_t minute; // 分钟（0~59）
    uint8_t second; // 秒（0~59）
};

// ==========================
// 📦 通用数据包结构（协议层）
// ==========================
struct FullPacket
{
    uint8_t start_flag1 = 0x23;     // 起始符 '#'
    uint8_t start_flag2 = 0x23;     // 起始符 '#'
    uint8_t command_id;             // 命令标识（如 0x81、0xD3 等）
    uint8_t response_flag;          // 应答标志（0xFE 表示命令包）
    std::string vin;                // 17 字节 VIN 编码（ASCII）
    uint8_t encryption_method;      // 加密方式（0x01 无加密）
    uint16_t data_length;           // 数据单元长度
    std::vector<uint8_t> data_unit; // 数据单元（二进制）
    uint8_t checksum;               // BCC 校验值
};

// ==========================
// ⚙️ MQTT 参数项结构（0x81 子项）
// ==========================
struct MqttParameterItem
{
    uint8_t param_id;           // 参数 ID（如 0x86~0x8B）
    std::vector<uint8_t> value; // 参数值（动态长度）
};

// ==========================
// 📡 设置 MQTT 参数（命令 0x81）
// ==========================
struct MqttParamSetting
{
    TimeStamp timestamp;                  // 设置时间（6 字节）
    uint16_t sequence;                    // 流水号（2 字节）
    uint8_t param_count;                  // 参数个数（0~252，0xFE 异常，0xFF 无效）
    std::vector<MqttParameterItem> items; // 参数项列表
};

// ==========================
// 🚗 车辆上报/通知/广播结构（命令 0xD3 / 0xD4 / 0xD5）
// ==========================
struct VehicleMessage
{
    TimeStamp timestamp;      // 时间（6 字节）
    uint16_t sequence;        // 流水号（2 字节）
    uint16_t message_length;  // 消息内容长度（2 字节）
    std::string json_payload; // JSON 字符串消息内容
};