/*
* Copyright (C) 2012-2019 UCloud. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/

#ifndef C_SDK_UIOT_DEFS_H_
#define C_SDK_UIOT_DEFS_H_

#ifdef __cplusplus
extern "C" {
#endif

#define IOT_PRODUCT_SN_LEN             (16)
#define IOT_PRODUCT_SECRET_LEN         (16)

#define IOT_DEVICE_SN_LEN              (64)
#define IOT_DEVICE_SECRET_LEN          (16)


#ifndef _IN_
#define _IN_
#endif

#ifndef _OU_
#define _OU_
#endif

typedef enum {
    MQTT_ALREADY_CONNECTED                            = 4,       // 表示与MQTT服务器已经建立连接
    MQTT_CONNECTION_ACCEPTED                          = 3,       // 表示服务器接受客户端MQTT连接
    MQTT_MANUALLY_DISCONNECTED                        = 2,       // 表示与MQTT服务器已经手动断开
    MQTT_RECONNECTED                                  = 1,       // 表示与MQTT服务器重连成功

    SUCCESS_RET                                       = 0,       // 表示成功返回
    FAILURE_RET                                       = -1,      // 表示失败返回

    ERR_PARAM_INVALID                                 = -2,      // 表示参数无效错误

    ERR_HTTP_CLOSED                                   = -3,      // 远程主机关闭连接
    ERR_HTTP_UNKNOWN_ERROR                            = -4,      // HTTP未知错误
    ERR_HTTP_PROTOCOL_ERROR                           = -5,      // 协议错误
    ERR_HTTP_UNRESOLVED_DNS                           = -6,      // 域名解析失败
    ERR_HTTP_URL_PARSE_ERROR                          = -7,      // URL解析失败
    ERR_HTTP_CONN_ERROR                               = -8,      // HTTP连接失败
    ERR_HTTP_AUTH_ERROR                               = -9,      // HTTP鉴权问题
    ERR_HTTP_NOT_FOUND                                = -10,     // HTTP 404
    ERR_HTTP_TIMEOUT                                  = -11,     // HTTP 超时

    ERR_MQTT_PUSH_TO_LIST_FAILED                      = -102,    // 表示往等待 ACK 列表中添加元素失败
    ERR_MQTT_NO_CONN                                  = -103,    // 表示未与MQTT服务器建立连接或已经断开连接
    ERR_MQTT_UNKNOWN_ERROR                            = -104,    // 表示MQTT相关的未知错误
    ERR_MQTT_ATTEMPTING_RECONNECT                     = -105,    // 表示正在与MQTT服务重新建立连接
    ERR_MQTT_RECONNECT_TIMEOUT                        = -106,    // 表示重连已经超时
    ERR_MQTT_MAX_SUBSCRIPTIONS_REACHED                = -107,    // 表示超过可订阅的主题数
    ERR_MQTT_SUB_FAILED                               = -108,    // 表示订阅主题失败, 即服务器拒绝
    ERR_MQTT_NOTHING_TO_READ                          = -109,    // 表示无MQTT相关报文可以读取
    ERR_MQTT_PACKET_READ_ERROR                        = -110,    // 表示读取的MQTT报文有问题
    ERR_MQTT_REQUEST_TIMEOUT                          = -111,    // 表示MQTT相关操作请求超时
    ERR_MQTT_CONNACK_UNKNOWN                          = -112,    // 表示客户端MQTT连接未知错误
    ERR_MQTT_CONNACK_UNACCEPTABLE_PROTOCOL_VERSION    = -113,    // 表示客户端MQTT版本错误
    ERR_MQTT_CONNACK_IDENTIFIER_REJECTED              = -114,    // 表示客户端标识符错误
    ERR_MQTT_CONNACK_SERVER_UNAVAILABLE               = -115,    // 表示服务器不可用
    ERR_MQTT_CONNACK_BAD_USERDATA                     = -116,    // 表示客户端连接参数中的username或password错误
    ERR_MQTT_CONNACK_NOT_AUTHORIZED                   = -117,    // 表示客户端连接认证失败
    ERR_MQTT_RX_MESSAGE_PACKET_TYPE_INVALID           = -118,    // 表示收到的消息无效
    ERR_MQTT_BUFFER_TOO_SHORT                         = -119,    // 表示消息接收缓冲区的长度小于消息的长度
    ERR_MQTT_QOS_NOT_SUPPORT                          = -120,    // 表示该QOS级别不支持
    ERR_MQTT_UNSUB_FAILED                             = -121,    // 表示取消订阅主题失败,比如该主题不存在

    ERR_JSON_PARSE                                    = -132,    // 表示JSON解析错误
    ERR_JSON_BUFFER_TRUNCATED                         = -133,    // 表示JSON文档会被截断
    ERR_JSON_BUFFER_TOO_SMALL                         = -134,    // 表示存储JSON文档的缓冲区太小
    ERR_JSON                                          = -135,    // 表示JSON文档生成错误
    ERR_MAX_JSON_TOKEN                                = -136,    // 表示超过JSON文档中的最大Token数
    ERR_MAX_APPENDING_REQUEST                         = -137,    // 表示超过同时最大的文档请求
    ERR_MAX_TOPIC_LENGTH                              = -138,    // 表示超过规定最大的topic长度

    ERR_SHADOW_PROPERTY_EXIST                         = -201,    // 表示注册的属性已经存在
    ERR_SHADOW_NOT_PROPERTY_EXIST                     = -202,    // 表示注册的属性不存在
    ERR_SHADOW_UPDATE_TIMEOUT                         = -203,    // 表示更新设备影子文档超时
    ERR_SHADOW_UPDATE_REJECTED                        = -204,    // 表示更新设备影子文档被拒绝
    ERR_SHADOW_GET_TIMEOUT                            = -205,    // 表示拉取设备影子文档超时
    ERR_SHADOW_GET_REJECTED                           = -206,    // 表示拉取设备影子文档被拒绝

    ERR_OTA_GENERAL_FAILURE                           = -301,    // 表示OTA通用FAILURE返回值
    ERR_OTA_INVALID_PARAM                             = -302,    // 表示OTA参数错误
    ERR_OTA_INVALID_STATE                             = -303,    // 表示OTA状态错误
    ERR_OTA_STR_TOO_LONG                              = -304,    // 表示OTA字符串长度超过限制
    ERR_OTA_FETCH_FAILED                              = -305,    // 表示固件下载失败
    ERR_OTA_FILE_NOT_EXIST                            = -306,    // 表示固件不存在
    ERR_OTA_FETCH_AUTH_FAIL                           = -307,    // 表示预签名认证失败
    ERR_OTA_FETCH_TIMEOUT                             = -308,    // 表示下载超时
    ERR_OTA_NO_MEMORY                                 = -309,    // 表示内存不足
    ERR_OTA_OSC_FAILED                                = -310,    // 表示OTA信号通道错误
    ERR_OTA_MD5_MISMATCH                              = -311,    // 表示MD5不匹配


    ERR_TCP_SOCKET_FAILED                             = -601,    // 表示TCP连接建立套接字失败
    ERR_TCP_UNKNOWN_HOST                              = -602,    // 表示无法通过主机名获取IP地址
    ERR_TCP_CONNECT_FAILED                            = -603,    // 表示建立TCP连接失败
    ERR_TCP_READ_TIMEOUT                              = -604,    // 表示TCP读超时
    ERR_TCP_WRITE_TIMEOUT                             = -605,    // 表示TCP写超时
    ERR_TCP_READ_FAILED                               = -606,    // 表示TCP读错误
    ERR_TCP_WRITE_FAILED                              = -607,    // 表示TCP写错误
    ERR_TCP_PEER_SHUTDOWN                             = -608,    // 表示TCP对端关闭了连接
    ERR_TCP_NOTHING_TO_READ                           = -609,    // 表示底层没有数据可以读取

    ERR_SSL_INIT_FAILED                               = -701,    // 表示SSL初始化失败
    ERR_SSL_CERT_FAILED                               = -702,    // 表示SSL证书相关问题
    ERR_SSL_CONNECT_FAILED                            = -703,    // 表示SSL连接失败
    ERR_SSL_CONNECT_TIMEOUT                           = -704,    // 表示SSL连接超时
    ERR_SSL_WRITE_TIMEOUT                             = -705,    // 表示SSL写超时
    ERR_SSL_WRITE_FAILED                              = -706,    // 表示SSL写错误
    ERR_SSL_READ_TIMEOUT                              = -707,    // 表示SSL读超时
    ERR_SSL_READ_FAILED                               = -708,    // 表示SSL读错误
    ERR_SSL_NOTHING_TO_READ                           = -709,    // 表示底层没有数据可以读取
} IoT_Error_t;

#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))

#ifdef ENABLE_LOG_DEBUG
#define LOG_DEBUG(...)    \
    {\
    HAL_Printf("DEBUG:   %s L#%d ", __func__, __LINE__);  \
    HAL_Printf(__VA_ARGS__); \
    HAL_Printf("\n"); \
    }
#else
#define LOG_DEBUG(...)
#endif

/**
 * @brief Info level logging macro.
 *
 * Macro to expose desired log message.  Info messages do not include automatic function names and line numbers.
 */
#ifdef ENABLE_LOG_INFO
#define LOG_INFO(...)    \
    {\
    HAL_Printf(__VA_ARGS__); \
    HAL_Printf("\n"); \
    }
#else
#define LOG_INFO(...)
#endif

/**
 * @brief Warn level logging macro.
 *
 * Macro to expose function, line number as well as desired log message.
 */
#ifdef ENABLE_LOG_WARN
#define LOG_WARN(...)   \
    { \
    HAL_Printf("WARN:  %s L#%d ", __func__, __LINE__);  \
    HAL_Printf(__VA_ARGS__); \
    HAL_Printf("\n"); \
    }
#else
#define LOG_WARN(...)
#endif

/**
 * @brief Error level logging macro.
 *
 * Macro to expose function, line number as well as desired log message.
 */
#ifdef ENABLE_LOG_ERROR
#define LOG_ERROR(...)  \
    { \
    HAL_Printf("ERROR: %s L#%d ", __func__, __LINE__); \
    HAL_Printf(__VA_ARGS__); \
    HAL_Printf("\n"); \
    }
#else
#define LOG_ERROR(...)
#endif

#ifdef ENABLE_IOT_TRACE
#define FUNC_ENTRY    \
    {\
    HAL_Printf("FUNC_ENTRY:   %s L#%d \n", __func__, __LINE__);  \
    }
#define FUNC_EXIT    \
    {\
    HAL_Printf("FUNC_EXIT:   %s L#%d \n", __func__, __LINE__);  \
    return; \
    }
#define FUNC_EXIT_RC(x)    \
    {\
    HAL_Printf("FUNC_EXIT:   %s L#%d Return Code : %d \n", __func__, __LINE__, x);  \
    return x; \
    }
#else
#define FUNC_ENTRY

#define FUNC_EXIT       { return; }
#define FUNC_EXIT_RC(x) { return x; }
#endif

#ifdef __cplusplus
}
#endif

#endif //C_SDK_UIOT_DEFS_H_
