/**
 * @file mqtt_err_def.h
 * @brief MQTT SDK 统一错误码定义头文件（模块分段+纯宏映射版）
 * @copyright Copyright (c) 2025 芯祥联科技
 * @author MQTT项目组
 * @version V1.0.0
 * @date 2025-12-30
 * @website https://www.xxltech.cn
 * @contact 合作邮箱：hezuo@xxltech.cn
 * @note 1. 所有错误码归入MQTT_ErrorCode枚举，按模块分段分配数值（-100/-200/-300/-400段）；
 *       2. 宏名完全匹配各模块现有定义，删除模块内错误码后无编译错误；
 *       3. 保留原有错误码映射逻辑，新增模块分段映射，兼容SDK对外错误码；
 *       4. 兼容MQTT 3.1.1/5.0双版本，5.0错误码宏隔离；
 *       5. 错误码描述宏覆盖所有枚举值，便于日志打印和问题定位。
 */
#ifndef MQTT_ERR_DEF_H
#define MQTT_ERR_DEF_H

#include "type.h"
#include "mqtt_client_sdk.h"  // 直接包含SDK头文件，复用MqttSdkErrCode定义

/************************** 错误码分段基础值（核心规则） **************************/
#define MQTT_ERR_BASE_PROTOCOL    -100  // 协议层：-101 ~ -150
#define MQTT_ERR_BASE_TOPIC       -200  // 主题管理层：-201 ~ -250
#define MQTT_ERR_BASE_CLIENT      -300  // 客户端核心层：-301 ~ -350
#define MQTT_ERR_BASE_CRYPTO      -400  // 加密层：-401 ~ -450

/************************** 所有错误码统一归入MQTT_ErrorCode枚举（模块分段赋值） **************************/
typedef enum {
    // -------------------------- 全局通用成功码 --------------------------
    MQTT_ERR_OK = 0,

    // -------------------------- 1. 协议层错误码（-101 ~ -150） --------------------------
    MQTT_ERR_INVALID_PARAM = MQTT_ERR_BASE_PROTOCOL - 1,        // -101：参数无效（原-1）
    MQTT_ERR_INVALID_QOS = MQTT_ERR_BASE_PROTOCOL - 2,          // -102：QoS非法（原-2）
    MQTT_ERR_MEM_ALLOC = MQTT_ERR_BASE_PROTOCOL - 3,            // -103：内存分配失败（原-3）
    MQTT_ERR_UTF8_INVALID = MQTT_ERR_BASE_PROTOCOL - 4,         // -104：UTF8格式错误（原-4）
    MQTT_ERR_NO_CACHE = MQTT_ERR_BASE_PROTOCOL - 5,             // -105：未找到缓存（原-5）
    MQTT_ERR_ID_EXHAUST = MQTT_ERR_BASE_PROTOCOL - 6,           // -106：Packet ID耗尽（原-6）
    MQTT_ERR_CACHE_FULL = MQTT_ERR_BASE_PROTOCOL - 7,           // -107：缓存满（原-7）
    MQTT_ERR_MSG_EXPIRED = MQTT_ERR_BASE_PROTOCOL - 8,          // -108：消息超时（原-8）
    MQTT_ERR_VERSION_NOT_SUPPORT = MQTT_ERR_BASE_PROTOCOL - 9,  // -109：版本不支持（原-9）
    MQTT_ERR_NOT_SUPPORT = MQTT_ERR_BASE_PROTOCOL - 10,         // -110：功能未支持（原-10）
    MQTT_ERR_DUPLICATE = MQTT_ERR_BASE_PROTOCOL - 11,           // -111：消息重复（原-11）
    MQTT_ERR_TIMEOUT = MQTT_ERR_BASE_PROTOCOL - 12,             // -112：操作超时（原-12）
    MQTT_ERR_MAX_PROPERTY_LEN = MQTT_ERR_BASE_PROTOCOL - 13,    // -113：属性长度超限（原-13）
    MQTT_ERR_BUFFER_FULL = MQTT_ERR_BASE_PROTOCOL - 14,         // -114：缓冲区满（原-14）
    MQTT_ERR_MUTEX_CREATE = MQTT_ERR_BASE_PROTOCOL - 15,        // -115：互斥锁创建失败（原-15）
    MQTT_ERR_INTERNAL = MQTT_ERR_BASE_PROTOCOL - 16,            // -116：内部逻辑错误（原-16）
    MQTT_ERR_BUF_NOT_ENOUGH = MQTT_ERR_BASE_PROTOCOL - 17,      // -117：缓冲区不足（原-17）
    MQTT_ERR_ENCODE_FAILED = MQTT_ERR_BASE_PROTOCOL - 18,       // -118：报文编码失败（原-18）
    MQTT_ERR_INVALID_CLIENT_ID = MQTT_ERR_BASE_PROTOCOL - 19,   // -119：客户端ID非法（原-19）
    MQTT_ERR_INVALID_PACKET = MQTT_ERR_BASE_PROTOCOL - 20,      // -120：报文格式非法（原-20）
    MQTT_ERR_NO_PROPERTY = MQTT_ERR_BASE_PROTOCOL - 21,         // -121：无属性段（原-21）
    MQTT_ERR_PROPERTY_LEN_INVALID = MQTT_ERR_BASE_PROTOCOL - 22,// -122：属性长度非法/越界（原-22）
    MQTT_ERR_ROLE_NOT_SUPPORT = MQTT_ERR_BASE_PROTOCOL - 23,    // -123：角色不支持（原-24）
    MQTT_ERR_PACKET_TOO_LARGE = MQTT_ERR_BASE_PROTOCOL - 24,    // -124：报文超过最大长度限制（原-25）

    // -------------------------- 2. 主题层错误码（-201 ~ -250） --------------------------
    MQTT_ERR_TOPIC_TOO_LONG = MQTT_ERR_BASE_TOPIC - 1,          // -201：主题长度超限（原-26）
    MQTT_ERR_TOPIC_LEVEL_EXCEED = MQTT_ERR_BASE_TOPIC - 2,      // -202：主题层级超限（原-27）
    MQTT_ERR_TOPIC_WILDCARD_INVALID = MQTT_ERR_BASE_TOPIC - 3,  // -203：通配符使用非法（原-28）
    // 主题层兼容宏映射（保持原有宏名）
    MQTT_TOPIC_ERR_INVALID_PARAM = MQTT_ERR_INVALID_PARAM,      // -101：参数无效（映射协议层）
    MQTT_TOPIC_ERR_TOO_LONG = MQTT_ERR_TOPIC_TOO_LONG,          // -201：主题过长
    MQTT_TOPIC_ERR_DUPLICATE = MQTT_ERR_DUPLICATE,              // -111：重复订阅（映射协议层）
    MQTT_TOPIC_ERR_NOT_FOUND = MQTT_ERR_NO_CACHE,               // -105：订阅未找到（映射协议层）
    MQTT_TOPIC_ERR_TOO_MANY = MQTT_ERR_CACHE_FULL,              // -107：订阅数超限（映射协议层）
    MQTT_TOPIC_ERR_INVALID_CHAR = MQTT_ERR_INVALID_PARAM,       // -101：主题字符非法（映射协议层）
    MQTT_TOPIC_ERR_NOT_SUPPORT = MQTT_ERR_NOT_SUPPORT,          // -110：主题功能未支持（映射协议层）
    MQTT_TOPIC_ERR_MUTEX_ERROR = MQTT_ERR_MUTEX_CREATE,         // -115：主题互斥锁错误（映射协议层）
    MQTT_TOPIC_ERR_OK = MQTT_ERR_OK,                            // 0：成功

    // -------------------------- 3. 客户端层错误码（-301 ~ -350） --------------------------
    MQTT_ERR_CONNECT_FAILED = MQTT_ERR_BASE_CLIENT - 1,         // -301：连接失败（原-23）
    MQTT_ERR_CLIENT_BUSY = MQTT_ERR_BASE_CLIENT - 2,            // -302：客户端忙（新增）
    MQTT_ERR_CLIENT_NO_CONN = MQTT_ERR_BASE_CLIENT - 3,         // -303：未连接服务器（新增）
    MQTT_ERR_CLIENT_TIMEOUT = MQTT_ERR_BASE_CLIENT - 4,         // -304：客户端操作超时（映射协议层timeout）
    MQTT_ERR_CLIENT_CREATE_FAILED = MQTT_ERR_BASE_CLIENT - 5,   // -305：客户端创建失败（新增）

    // -------------------------- 4. 加密层错误码（-401 ~ -450） --------------------------
    MQTT_ERR_CRYPTO_FAILED = MQTT_ERR_BASE_CRYPTO - 1,          // -401：加密失败（原-101）

    // -------------------------- MQTT5.0专属错误码（协议层扩展） --------------------------
    MQTT_ERR_50_REASON_CODE = MQTT_ERR_BASE_PROTOCOL - 30,      // -130：5.0原因码非成功（原-102）
} MQTT_ErrorCode;

// -------------------------- 主题层错误码类型定义（保持原有） --------------------------
typedef int32_xxl MqttTopicErrCode;
#define MQTT_TOPIC_ERR_OK          MQTT_TOPIC_ERR_OK
#define MQTT_TOPIC_ERR_INVALID_PARAM  MQTT_TOPIC_ERR_INVALID_PARAM
#define MQTT_TOPIC_ERR_TOO_LONG       MQTT_TOPIC_ERR_TOO_LONG
#define MQTT_TOPIC_ERR_DUPLICATE      MQTT_TOPIC_ERR_DUPLICATE
#define MQTT_TOPIC_ERR_NOT_FOUND      MQTT_TOPIC_ERR_NOT_FOUND
#define MQTT_TOPIC_ERR_TOO_MANY       MQTT_TOPIC_ERR_TOO_MANY
#define MQTT_TOPIC_ERR_INVALID_CHAR   MQTT_TOPIC_ERR_INVALID_CHAR
#define MQTT_TOPIC_ERR_NOT_SUPPORT    MQTT_TOPIC_ERR_NOT_SUPPORT
#define MQTT_TOPIC_ERR_MUTEX_ERROR    MQTT_TOPIC_ERR_MUTEX_ERROR

// -------------------------- 错误码描述宏（覆盖所有枚举值，保留原有可用结构） --------------------------
#define MQTT_ERR_DESC(err) \
    (err == MQTT_ERR_OK ? "成功" : \
     err == MQTT_ERR_INVALID_PARAM ? "参数无效" : \
     err == MQTT_ERR_INVALID_QOS ? "QoS非法" : \
     err == MQTT_ERR_MEM_ALLOC ? "内存分配失败" : \
     err == MQTT_ERR_UTF8_INVALID ? "UTF8格式错误" : \
     err == MQTT_ERR_NO_CACHE ? "未找到缓存" : \
     err == MQTT_ERR_ID_EXHAUST ? "Packet ID耗尽" : \
     err == MQTT_ERR_CACHE_FULL ? "缓存满" : \
     err == MQTT_ERR_MSG_EXPIRED ? "消息超时" : \
     err == MQTT_ERR_VERSION_NOT_SUPPORT ? "版本不支持" : \
     err == MQTT_ERR_NOT_SUPPORT ? "功能未支持" : \
     err == MQTT_ERR_DUPLICATE ? "消息重复" : \
     err == MQTT_ERR_TIMEOUT ? "操作超时" : \
     err == MQTT_ERR_MAX_PROPERTY_LEN ? "属性长度超限" : \
     err == MQTT_ERR_BUFFER_FULL ? "缓冲区满" : \
     err == MQTT_ERR_MUTEX_CREATE ? "互斥锁创建失败" : \
     err == MQTT_ERR_INTERNAL ? "内部逻辑错误" : \
     err == MQTT_ERR_BUF_NOT_ENOUGH ? "缓冲区不足" : \
     err == MQTT_ERR_ENCODE_FAILED ? "报文编码失败" : \
     err == MQTT_ERR_INVALID_CLIENT_ID ? "客户端ID非法" : \
     err == MQTT_ERR_INVALID_PACKET ? "报文格式非法" : \
     err == MQTT_ERR_NO_PROPERTY ? "无属性段" : \
     err == MQTT_ERR_PROPERTY_LEN_INVALID ? "属性长度非法/越界" : \
     err == MQTT_ERR_CONNECT_FAILED ? "连接失败" : \
     err == MQTT_ERR_ROLE_NOT_SUPPORT ? "角色不支持" : \
     err == MQTT_ERR_PACKET_TOO_LARGE ? "报文超过最大长度限制" : \
     err == MQTT_ERR_TOPIC_TOO_LONG ? "主题长度超限" : \
     err == MQTT_ERR_TOPIC_LEVEL_EXCEED ? "主题层级超限" : \
     err == MQTT_ERR_TOPIC_WILDCARD_INVALID ? "通配符使用非法" : \
     err == MQTT_ERR_CRYPTO_FAILED ? "加密失败" : \
     err == MQTT_ERR_50_REASON_CODE ? "MQTT5.0原因码非成功" : \
     err == MQTT_ERR_CLIENT_BUSY ? "客户端忙" : \
     err == MQTT_ERR_CLIENT_NO_CONN ? "客户端未连接" : \
     err == MQTT_ERR_CLIENT_CREATE_FAILED ? "客户端创建失败" : "未知错误")

// -------------------------- 极简版错误码映射宏（纯宏定义、无复杂判断、精准映射+兜底） --------------------------
#define MQTT_ERR_TO_SDK(err) \
    ( \
        (err) == MQTT_ERR_OK ? MQTT_SDK_OK : \
        /* 参数类错误 */ \
        (err) == MQTT_ERR_INVALID_PARAM ? MQTT_SDK_ERR_PARAM : \
        (err) == MQTT_ERR_INVALID_QOS ? MQTT_SDK_ERR_PARAM : \
        (err) == MQTT_ERR_INVALID_CLIENT_ID ? MQTT_SDK_ERR_PARAM : \
        (err) == MQTT_ERR_TOPIC_WILDCARD_INVALID ? MQTT_SDK_ERR_PARAM : \
        (err) == MQTT_TOPIC_ERR_INVALID_PARAM ? MQTT_SDK_ERR_PARAM : \
        (err) == MQTT_TOPIC_ERR_INVALID_CHAR ? MQTT_SDK_ERR_PARAM : \
        /* 内存错误 */ \
        (err) == MQTT_ERR_MEM_ALLOC ? MQTT_SDK_ERR_MEM : \
        /* 超时错误 */ \
        (err) == MQTT_ERR_TIMEOUT ? MQTT_SDK_ERR_TIMEOUT : \
        (err) == MQTT_ERR_CLIENT_TIMEOUT ? MQTT_SDK_ERR_TIMEOUT : \
        /* 连接错误 */ \
        (err) == MQTT_ERR_CONNECT_FAILED ? MQTT_SDK_ERR_CONN : \
        (err) == MQTT_ERR_VERSION_NOT_SUPPORT ? MQTT_SDK_ERR_CONN : \
        (err) == MQTT_ERR_CLIENT_NO_CONN ? MQTT_SDK_ERR_CONN : \
        /* 发布错误 */ \
        (err) == MQTT_ERR_PACKET_TOO_LARGE ? MQTT_SDK_ERR_PUB : \
        (err) == MQTT_ERR_ENCODE_FAILED ? MQTT_SDK_ERR_PUB : \
        /* 订阅错误 */ \
        (err) == MQTT_ERR_DUPLICATE ? MQTT_SDK_ERR_SUB : \
        (err) == MQTT_ERR_CACHE_FULL ? MQTT_SDK_ERR_SUB : \
        (err) == MQTT_TOPIC_ERR_TOO_LONG ? MQTT_SDK_ERR_SUB : \
        (err) == MQTT_TOPIC_ERR_DUPLICATE ? MQTT_SDK_ERR_SUB : \
        (err) == MQTT_TOPIC_ERR_NOT_FOUND ? MQTT_SDK_ERR_SUB : \
        (err) == MQTT_TOPIC_ERR_TOO_MANY ? MQTT_SDK_ERR_SUB : \
        /* Packet ID错误 */ \
        (err) == MQTT_ERR_ID_EXHAUST ? MQTT_SDK_ERR_PKT_ID : \
        /* 客户端忙/创建失败 */ \
        (err) == MQTT_ERR_CLIENT_BUSY ? MQTT_SDK_ERR_BUSY : \
        (err) == MQTT_ERR_CLIENT_CREATE_FAILED ? MQTT_SDK_ERR_CREATE : \
        /* 兜底：所有未匹配的错误码返回其他错误 */ \
        MQTT_SDK_ERR_OTHER \
    )

#endif // MQTT_ERR_DEF_H
