#ifndef JSON_MODULE_H
#define JSON_MODULE_H

#include <stdlib.h>
#include <stdio.h>
#include "../base/CommonStruct.h"
#include "../base/BaseDefine.h"
//std::string GetTestJson(const int statuscode,const char* msg,const char* orderid);

//void parseJson(const char* json);
class JsonModule
{
public:
    JsonModule();
    ~JsonModule();

    void jsonTest();
    
    bool getPushOrders(IN const char* json,OUT orderObj &order);

    /* 功能:判断是否是初始化数据
     * 参数:[1]待判断数据
     * 返回:...
     * */
    bool isInitData(IN const std::string& data);

    /* 功能:获取初始化返回数据
     * 参数:[1]返回json数据 [2]pos需要的json数据
     * 返回:是否正确格式
     * */
    bool getInitBackData(IN const char* inJson,OUT std::string& outJson);

    /* 功能:判断是否是心跳包
     * 参数:[1]待判断数据
     * 返回:...
     * */
    bool isHeartbeatData(IN const char* data);

    /* 功能:检查初始化数据是否可用
     * 参数:[1]待检查数据[2]POS监听端口
     * 返回:是否正确格式
     * */
    bool checkInitData(IN const std::string& data, OUT int& posListenPort);

    /* 功能:转换POS初始化数据格式到中台数据格式
     * 参数:[1]POS数据格式[2]转换后数据
     * 返回:是否转换成功
     * */
    bool convertInitDataPos2Ods(IN const std::string& data, OUT std::string& result);

    /* 功能:转换POS设置POS优先级数据格式到中台数据格式
     * 参数:[1]POS数据格式[2]转换后数据
     * 返回:是否转换成功
     * */
    bool convertSetPosPriorityDataPos2Ods(IN const std::string& data, OUT std::string& result);

    /* 功能:获取POS设置优先级，ODS返回数据
     * 参数:[1]返回json数据 [2]pos需要的json数据
     * 返回:是否正确格式
     * */
    bool getSetPosPriorityBackData(IN const char* inJson,OUT std::string& outJson);

    /* 功能:获取POS请求的返回数据
     * 参数:[1]状态码[2]消息[3]转换后数据
     * 重载:[1]ODS返回数据[2]转换后数据
     * 返回:是否转换成功
     * */
    bool getPosResponseData(IN int status, IN const std::string& msg, OUT std::string& result);
    bool getPosResponseData(IN const std::string& odsResponse,IN const std::string& posReq, OUT std::string& result);

    /* 功能:获取ODS推送的返回数据
     * 参数:[1]状态码[2]消息[3]转换后数据
     * 重载:[1]POS返回数据[2]订单数据[3]转换后数据
     * 重载:[1]POS返回数据[2]订单数据[3]ods发送数据[4]转换后数据
     * 返回:是否转换成功
     * */
    bool getOdsResponseData(IN int status_code, IN const std::string& msg, OUT std::string& result);
    bool getOdsResponseData(IN const std::string& posResponse, IN const std::string& orderData,IN const std::string& odsData, OUT std::string& result);

    /* 功能:转换POS数据格式到中台数据格式
     * 参数:[1]POS数据格式[2]转换后数据
     * 返回:是否转换成功
     * */
    bool convertDataPos2Ods(IN const std::string& data, OUT std::string& result);

    /* 功能:转换中台数据格式到POS数据格式
     * 参数:[1]中台数据格式[2]转换后数据
     * 返回:是否转换成功
     * */
    bool convertDataOds2Pos(IN const std::string& data, OUT std::string& result);

    /* 功能:获取推送类型
     * 参数:[1]待判断数据
     * 返回:...
     * */
    int getPushType(IN const char* data);

    /* 功能:缓存初始化信息，其它接口需要门店信息字段时可以直接拿取
     * 参数:[1]初始化json
     * 返回:...
     * */
    void setInitData(IN const char* data);

private:
    std::string _store_id;      //门店号

private:
    std::string _getDeliveryTypeString(int type);
    //订单状态转换（转换为POS对应的状态）
    int _getPOSOrderStatus(int status);
    //POS请求类型转换为ODS需要类型
    int _getODSStatusByPOSReq(int fm_cmd);
    std::string _getPickupCodeString(std::string &channel,std::string &pickup_code);

    void _getStatusObj(IN orderObj &order_obj,OUT orderStatusObj &status_obj);
    void _getRefundObj(IN orderObj &order_obj,OUT refundObj &refund_obj);
    void _getStockWarnObj(IN const char* json,OUT stockWarnObj &warn_obj);

    //pos操作请求json转换为结构体
    bool _getPOSOperationObj(IN const char* data,OUT orderOperationObj &operation_obj);
    std::string _convertPosOperationToOdsJson(orderOperationObj &operation_obj);

    //服务器返回值（针对pos操作订单请求）
    //bool _getServerResponseData(IN const char* json,OUT serverResponseOperationObj &obj);
    //std::string _convertServerResponseToJson(serverResponseOperationObj &operation_obj);

    std::string _convertToNewOrderJson(orderObj &obj);
    std::string _convertToOrderStatusJson(orderStatusObj &obj);
    std::string _convertToRefundJson(refundObj &obj);
    std::string _convertToStockWarnJson(stockWarnObj &obj);
    std::string _convertToCommonWarnJson(IN const char* json);
    std::string _convertToOrderOperationReponseJson(IN const char* json);
    bool _convertPOSReqPriorityJson(IN const std::string& posReq,OUT const std::string& odsJson);

    bool _getOrderResponseJson(IN const std::string& posResponse, IN const std::string& orderData, IN const std::string& odsData, OUT std::string& result);
    bool _getStockWarnResponseJson(IN const std::string& posResponse, IN const std::string& orderData, IN const std::string& odsData,OUT std::string& result);
    bool _getCommonWarnResponseJson(IN const std::string& posResponse, IN const std::string& orderData, IN const std::string& odsData,OUT std::string& result);

};

#endif
