#pragma once

#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

/************************** 标准编码规则宏定义(GB46750-2025表3) **************************/
// 数据类型固定值（表1要求）
#define PACKET_DATA_TYPE        0xFF
// 版本号宏（标准要求：前3位固定001，后5位0~63，即V1.X）
#define VERSION_MAJOR_FIXED     1               // 主版本固定为1（前3位001）
#define VERSION_MINOR_FIXED     0
#define VERSION_ENCODE    ((((VERSION_MAJOR_FIXED) & 0x07) << 5) | ((VERSION_MINOR_FIXED) & 0x3F))
#define VERSION_DECODE_MAJOR(ver) ((ver) >> 5)   // 从编码值解码主版本
#define VERSION_DECODE_MINOR(ver) ((ver) & 0x3F) // 从编码值解码从版本

// 基础数据标识字节数(3字节)，扩展标志位默认0（表2要求）
#define BASE_DATA_FLAG_BYTES    3
// 最大数据内容项字节数(1~200)（表1要求）
#define MAX_CONTENT_BYTES       200
// 字符串填充字符(NULL)（表3要求）
#define FILL_CHAR               '\0'

// 经纬度放大倍数(×10^7)（表3要求）
#define LAT_LON_SCALE           10000000LL
// 大地高度/气压高度：(h+1000)×2，分辨率0.5m（表3要求）
#define GEO_ALT_OFFSET          1000
#define GEO_ALT_SCALE           2
// 相对高度：(h+9000)×2，分辨率0.5m（表3要求）
#define REL_ALT_OFFSET          9000
#define REL_ALT_SCALE           2
// 航迹角/地速放大倍数(×10)，分辨率0.1°/0.1m/s（表3要求）
#define ANGLE_SPEED_SCALE       10
// 垂直速度放大倍数(×2)，分辨率0.5m/s（表3要求）
#define VERT_SPEED_SCALE        2
// 定义总编码发送字节数
#define EXTEND_N_BYTE (0) // 除了默认3字节 扩展的字节
#define EXTEND_N_INFO (0) // 除了默认3字节数据包字节数 扩展的包数据数
#define SEND_ENCODE_PACKAGE_HEAD_LEN (0x3)
#define SEND_ENCODE_PACKAGE_DATA_MARK (0x3+EXTEND_N_BYTE)
#define SEND_ENCODE_PACKAGE_INFO (72)
#define SEND_ENCODE_PACKAGE_LEN (SEND_ENCODE_PACKAGE_HEAD_LEN+SEND_ENCODE_PACKAGE_DATA_MARK+SEND_ENCODE_PACKAGE_INFO)

/************************** 按字节分类的掩码宏定义 **************************/
// 第1字节：控制001~007项（表2对应关系）
#define BYTE1_MASK_001  0x80  // 唯一产品识别码（M）
#define BYTE1_MASK_002  0x40  // 实名登记标志（M）
#define BYTE1_MASK_003  0x20  // 运行类别（O）
#define BYTE1_MASK_004  0x10  // 无人机分类（M）
#define BYTE1_MASK_005  0x08  // 遥控站位置类型（M）
#define BYTE1_MASK_006  0x04  // 遥控站位置（M）
#define BYTE1_MASK_007  0x02  // 遥控站高度（M）

// 第2字节：控制008~014项（表2对应关系）
#define BYTE2_MASK_008  0x80  // 无人机位置（M）
#define BYTE2_MASK_009  0x40  // 航迹角（M）
#define BYTE2_MASK_010  0x20  // 地速（M）
#define BYTE2_MASK_011  0x10  // 相对高度（O）
#define BYTE2_MASK_012  0x08  // 垂直速度（O）
#define BYTE2_MASK_013  0x04  // 无人机大地高度（M）
#define BYTE2_MASK_014  0x02  // 气压高度（O）

// 第3字节：控制015~021项（表2对应关系）
#define BYTE3_MASK_015  0x80  // 运行状态（M）
#define BYTE3_MASK_016  0x40  // 坐标系类型（M）
#define BYTE3_MASK_017  0x20  // 水平精度（M）
#define BYTE3_MASK_018  0x10  // 垂直精度（M）
#define BYTE3_MASK_019  0x08  // 速度精度（M）
#define BYTE3_MASK_020  0x04  // 时间戳（M）
#define BYTE3_MASK_021  0x02  // 时间戳精度（M）
// 下一个字节是否是标识字节
#define MARK_BYTE_NEXT (0x01)
// 全字段使能掩码（可选字段强制发送）
// 第1字节所有必选+可选字段掩码（不含扩展位）
#define BYTE1_ALL_FIELDS (BYTE1_MASK_001 | BYTE1_MASK_002 | BYTE1_MASK_003 | \
                          BYTE1_MASK_004 | BYTE1_MASK_005 | BYTE1_MASK_006 | \
                          BYTE1_MASK_007)

#define BYTE2_ALL_FIELDS   (BYTE2_MASK_008 | BYTE2_MASK_009 | BYTE2_MASK_010 | \
                            BYTE2_MASK_011 | BYTE2_MASK_012 | BYTE2_MASK_013 | \
                            BYTE2_MASK_014)  // 0xFE

#define BYTE3_ALL_FIELDS   (BYTE3_MASK_015 | BYTE3_MASK_016 | BYTE3_MASK_017 | \
                            BYTE3_MASK_018 | BYTE3_MASK_019 | BYTE3_MASK_020 | \
                            BYTE3_MASK_021)  // 0xFE

/************************** 枚举类型定义(GB46750-2025表2/表3) **************************/
// 坐标系类型
typedef enum {
    COORD_WGS84       = 0,    // WGS-84(默认)
    COORD_CGCS2000    = 1,    // 2000国家大地坐标系
    COORD_RESERVED    = 2     // 预留
} UavCoordType;

// 无人机分类
typedef enum {
    UAV_TYPE_MICRO    = 0,    // 微型
    UAV_TYPE_LIGHT    = 1,    // 轻型
    UAV_TYPE_SMALL    = 2,    // 小型
    UAV_TYPE_MEDIUM   = 3,    // 中型
    UAV_TYPE_LARGE    = 4,    // 大型
    UAV_TYPE_RESERVED = 5     // 预留
} UavType;

// 无人机运行状态
typedef enum {
    UAV_STATE_UNREPORTED      = 0,    // 未报告
    UAV_STATE_GROUND          = 1,    // 地面
    UAV_STATE_AIR             = 2,    // 空中
    UAV_STATE_EMERGENCY       = 3,    // 紧急状态
    UAV_STATE_TX_FAIL_NORMAL  = 4,    // 发送失效-非紧急
    UAV_STATE_TX_FAIL_EMERG   = 5,    // 发送失效-紧急
    UAV_STATE_RESERVED        = 6     // 预留
} UavRunState;

// 遥控站位置类型
typedef enum {
    STATION_TYPE_TAKEOFF = 0,    // 起飞点位置
    STATION_TYPE_REMOTE  = 1,    // 遥控站位置
    STATION_TYPE_RESERVED= 2     // 预留
} UavStationType;

// 无人机运行类别
typedef enum {
    UAV_RUN_UNDEFINED = 0,    // 未定义
    UAV_RUN_OPEN      = 1,    // 开放类
    UAV_RUN_SPECIFIC  = 2,    // 特定类
    UAV_RUN_APPROVED  = 3,    // 审定类
    UAV_RUN_RESERVED  = 4     // 预留
} UavRunClass;


typedef enum UavHorizontalAccuracy {
    UAV_HOR_ACC_UNKNOWN = 0,
    UAV_HOR_ACC_10NM = 1,      // Nautical Miles. 18.52 km
    UAV_HOR_ACC_4NM = 2,       // 7.408 km
    UAV_HOR_ACC_2NM = 3,       // 3.704 km
    UAV_HOR_ACC_1NM = 4,       // 1.852 km
    UAV_HOR_ACC_0_5NM = 5,     // 926 m
    UAV_HOR_ACC_0_3NM = 6,     // 555.6 m
    UAV_HOR_ACC_0_1NM = 7,     // 185.2 m
    UAV_HOR_ACC_0_05NM = 8,    // 92.6 m
    UAV_HOR_ACC_30_METER = 9,
    UAV_HOR_ACC_10_METER = 10,
    UAV_HOR_ACC_3_METER = 11,
    UAV_HOR_ACC_1_METER = 12,
    // 13 to 15 reserved
} UavHorizontalAccuracy_t;


typedef enum UavVerticalAccuracy {
    UAV_VER_ACC_UNKNOWN = 0,
    UAV_VER_ACC_150_METER = 1,
    UAV_VER_ACC_45_METER = 2,
    UAV_VER_ACC_25_METER = 3,
    UAV_VER_ACC_10_METER = 4,
    UAV_VER_ACC_3_METER = 5,
    UAV_VER_ACC_1_METER = 6,
    // 7 to 15 reserved
} UavVerticalAccuracy_t;

typedef enum UAVSpeedAccuracy {
    UAV_SPEED_ACC_UNKNOWN = 0,
    UAV_SPEED_ACC_10_METERS_PER_SECOND = 1,
    UAV_SPEED_ACC_3_METERS_PER_SECOND = 2,
    UAV_SPEED_ACC_1_METERS_PER_SECOND = 3,
    UAV_SPEED_ACC_0_3_METERS_PER_SECOND = 4,
    // 5 to 15 reserved
}  UAVSpeedAccuracy_t;

typedef enum UavTimestampAccuracy {
    UAV_TIME_ACC_UNKNOWN = 0,
    UAV_TIME_ACC_0_5_SECOND = 1,
    UAV_TIME_ACC_0_4_SECOND = 2,
    UAV_TIME_ACC_0_3_SECOND = 3,
    UAV_TIME_ACC_0_2_SECOND = 4,
    UAV_TIME_ACC_0_1_SECOND = 5,
    UAV_TIME_ACC_0_05_SECOND = 6,
    UAV_TIME_ACC_0_02_SECOND = 7,
    UAV_TIME_ACC_0_01_SECOND = 8,
} UavTimestampAccuracy_t;

/************************** 核心数据结构体(存储原始物理值) **************************/
// 无人机运行识别原始数据(上层业务直接赋值，无需关心编码规则)
typedef struct {
    // 必选-身份信息
    char unique_code[20+1];        // 001-唯一产品识别码(20byte，ASCII) 大端序
    char register_id[8+1];       // 002-实名登记标志(8byte，ASCII，后8位) 大端序
    UavType uav_type;            // 004-无人机分类
    UavRunState run_state;       // 015-运行状态
    UavCoordType coord_type;     // 016-坐标系类型

    // 必选-位置信息(原始值：经纬度°，高度m；西经/南纬为负)
    UavStationType station_type; // 005-遥控站位置类型
    double station_lon;          // 006-遥控站经度
    double station_lat;          // 006-遥控站纬度
    double station_geo_alt;      // 007-遥控站大地高度
    double uav_lon;              // 008-无人机经度
    double uav_lat;              // 008-无人机纬度
    double uav_geo_alt;          // 013-无人机大地高度

    // 必选-运动信息(原始值：航迹角°，地速m/s)
    double track_angle;          // 009-航迹角(真北顺时针，0~359.9)
    double ground_speed;         // 010-地速(≥0)

    // 必选-精度信息(按表3取值)
    UavHorizontalAccuracy_t hori_accuracy;       // 017-水平精度
    UavVerticalAccuracy_t vert_accuracy;       // 018-垂直精度
    UAVSpeedAccuracy_t speed_accuracy;      // 019-速度精度
    uint64_t timestamp;          // 020-时间戳(ms，Unix)
    UavTimestampAccuracy_t time_accuracy;       // 021-时间戳精度

    // 可选-扩展信息（强制发送，无需外部使能）
    UavRunClass run_class;       // 003-运行类别
    double uav_rel_alt;          // 011-相对高度(m，基于起飞点)
    double uav_vert_speed;       // 012-垂直速度(m/s，正升负降)
    double uav_press_alt;        // 014-气压高度(m，101.325kPa为基准)

    // 字段有效性标志(是否有效，无效则编码为未知值)
    bool is_station_pos_valid;   // 遥控站经纬度
    bool is_uav_pos_valid;       // 无人机经纬度
    bool is_station_alt_valid;   // 遥控站大地高度
    bool is_uav_geo_alt_valid;   // 无人机大地高度
    bool is_track_angle_valid;   // 航迹角
    bool is_ground_speed_valid;  // 地速
    bool is_timestamp_valid;     // 时间戳
    bool is_rel_alt_valid;       // 相对高度
    bool is_vert_speed_valid;    // 垂直速度
    bool is_press_alt_valid;     // 气压高度

    // 可选字段接收标志（解包时自动置位，组包时无需关注）
    bool flag_run_class;         // 003-运行类别是否接收
    bool flag_rel_alt;           // 011-相对高度是否接收
    bool flag_vert_speed;        // 012-垂直速度是否接收
    bool flag_press_alt;         // 014-气压高度是否接收
} UavIdentificationData;

/************************** 数据包结构体(GB46750-2025图3) **************************/
// 无人机运行识别数据包(组包后/解包前的字节流载体)
typedef struct {
    uint8_t data_type;           // 1byte-数据类型(固定0xFF)
    uint8_t version;             // 1byte-版本号(3+5bit，V1.X)
    uint8_t content_len;          // 1byte-数据内容项字节数
    uint8_t data_flag[BASE_DATA_FLAG_BYTES]; // 3byte-基础数据标识位
    uint8_t content[MAX_CONTENT_BYTES];      // 可变长-数据内容项(编码后)
} UavIdentificationPacket;

/************************** 工具函数：字节序转换 **************************/
// 16位无符号整数转小端序字节
void uav_put_uint16_le(uint16_t val, uint8_t *buf);
// 32位无符号整数转小端序字节
void uav_put_uint32_le(uint32_t val, uint8_t *buf);
// 小端序字节转16位无符号整数
uint16_t uav_get_uint16_le(const uint8_t *buf);
// 小端序字节转32位无符号整数
uint32_t uav_get_uint32_le(const uint8_t *buf);

/************************** 编码函数：原始值→标准编码值 **************************/
// 经纬度编码(°→32位小端序整数，×10^7)
uint32_t uav_enc_lat(double lat, bool is_valid);
uint32_t uav_enc_lon(double lon, bool is_valid);
// 大地高度/气压高度编码(m→16位小端序整数，(h+1000)×2)
uint16_t uav_enc_geo_alt(double alt, bool is_valid);
// 相对高度编码(m→16位小端序整数，(h+9000)×2)
uint16_t uav_enc_rel_alt(double alt, bool is_valid);
// 航迹角编码(°→16位小端序整数，×10)
uint16_t uav_enc_track_angle(double angle, bool is_valid);
// 地速编码(m/s→16位小端序整数，×10)
uint16_t uav_enc_ground_speed(double speed, bool is_valid);
// 垂直速度编码(m/s→1字节，bit7表方向，数值×2)
uint8_t uav_enc_vert_speed(double v_speed, bool is_valid);
// 时间戳编码(ms→6字节小端序，仅取低6字节)
void uav_enc_timestamp(uint64_t timestamp, bool is_valid, uint8_t *buf);
// 设置数据包版本号(从版本X→V1.X，返回1字节编码值)
uint8_t uav_set_packet_version(uint8_t minor);

/************************** 解码函数：标准编码值→原始值 **************************/
// 经纬度解码(32位编码值→°，÷10^7)
double uav_dec_lat(uint32_t enc_val);
double uav_dec_lon(uint32_t enc_val);
// 大地高度/气压高度解码(16位编码值→m，(val/2)-1000)
double uav_dec_geo_alt(uint16_t enc_val);
// 相对高度解码(16位编码值→m，(val/2)-9000)
double uav_dec_rel_alt(uint16_t enc_val);
// 航迹角解码(16位编码值→°，÷10)
double uav_dec_track_angle(uint16_t enc_val);
// 地速解码(16位编码值→m/s，÷10)
double uav_dec_ground_speed(uint16_t enc_val);
// 垂直速度解码(1字节编码值→m/s，正升负降)
double uav_dec_vert_speed(uint8_t enc_val);
// 时间戳解码(6字节小端序→ms，Unix)
uint64_t uav_dec_timestamp(const uint8_t *buf);

/************************** 核心函数：组包+解包 **************************/
// 初始化原始数据结构体(填充默认值/空字符/标志位false)
void uav_identification_data_init(UavIdentificationData *data);
// 组包：原始数据→标准数据包(返回0成功，-1参数错，-2内容超长)
int8_t uav_identification_pack(UavIdentificationPacket *packet, const UavIdentificationData *data );
// 解包：标准数据包→原始数据(返回0成功，-1参数错，-2包格式错，-3数据标识位异常)
int8_t uav_identification_unpack(UavIdentificationData *data, const UavIdentificationPacket *packet);
// 打印数据包(调试用，输出十六进制+关键字段)
void uav_identification_packet_print(const UavIdentificationPacket *packet);
// 打印原始数据(调试用，输出解码后的物理值)
void uav_identification_data_print(const UavIdentificationData *data);



// 组wifi和ble包函数
int did_GB2025_message_build_pack(UavIdentificationData  *UAS_Data, uint8_t *pack, size_t buflen);

int did_GB2025_wifi_build_nan_sync_beacon_frame(char *mac, uint8_t *buf, size_t buf_size);

int did_GB2025_wifi_build_message_pack_nan_action_frame(UavIdentificationData  *UAS_Data, char *mac,
                                                  uint8_t send_counter,
                                                  uint8_t *buf, size_t buf_size);

int did_GB2025_wifi_build_message_pack_beacon_frame(UavIdentificationData  *UAS_Data, char *mac,
                                              const char *SSID, size_t SSID_len,
                                              uint16_t interval_tu, uint8_t send_counter,
                                              uint8_t *buf, size_t buf_size);

int did_GB2025_message_process_pack(UavIdentificationData  *UAS_Data, uint8_t *pack, size_t buflen);

int did_GB2025_wifi_receive_message_pack_nan_action_frame(UavIdentificationData  *UAS_Data,
                                                    char *mac, uint8_t *buf, size_t buf_size);