#ifndef JSONFACTORY
#define JSONFACTORY

#include "global.h"
#include "fmtool.h"
#include <QJsonObject>
#include <QJsonArray>
#include <QStringList>
#include <QJsonParseError>
#include <QJsonDocument>
#include <QDateTime>
#include "fmp_settings.h"
#include "fmglobal.h"

//接受pos的请求转化为json
class JsonFactory
{
public:

    static bool GetJsonWithType(ReqType type, QJsonObject &json, const QJsonObject &reqJson, QStringList list)
    {
        switch (type) {
        case SIGN:
            return GetSignJson(json, reqJson, list);
        case PAY:
            return GetPayJson(json, reqJson, list);
        case REFUND:
            return GetRefundJosn(json, reqJson, list);
        case ENDDAY:
            return GetEnddayJson(json, reqJson, list);
        case FINDS:
            return GetFindJson(json, reqJson, list);
        case AGAIN_PRINT:
            return GetAgainPrinteJson(json, reqJson, list);
        default:
            json = reqJson;
            return false;
            break;
        }
    }

private:
    static bool GetSignJson(QJsonObject &json, const QJsonObject &reqJson, QStringList l)
    {
        json[JSON_KEY_VER] = reqJson[JSON_KEY_VER];
        json[JSON_KEY_PARTNERID] = reqJson[JSON_KEY_PARTNERID];
        json[JSON_KEY_STOREID] = reqJson[JSON_KEY_STOREID];
        json[JSON_KEY_STATIONID] = reqJson[JSON_KEY_STATIONID];
        return true;
    }

    //支付
    static bool GetPayJson(QJsonObject &json, const QJsonObject &reqJson, QStringList list)
    {
        if(list.size() != 1 || list[0].isEmpty())
            return false;
        json = reqJson;
        json[JSON_KEY_CODE] = list[0];
        json[JSON_KEY_REQTYPE] = JSON_REQTYPE_PAY;
        return true;
    }

    //退款
    static bool GetRefundJosn(QJsonObject &json, const QJsonObject &reqJson, QStringList list)
    {
        if(list.size() != 1 || list[0].isEmpty())
            return false;
        json = reqJson;
        json.insert(JSON_KEY_FMID, list[0]);
        json[JSON_KEY_REQTYPE] = JSON_REQTYPE_REFUND;
        json[JSON_KEY_REFUNDAMOUT] = reqJson[JSON_KEY_TRANSAMOUNT];
        json[JSON_KEY_REFUNDID] = reqJson[JSON_KEY_TRANSID];
        json.remove(JSON_KEY_TRANSAMOUNT);
        return true;
    }

    //日结
    static bool GetEnddayJson(QJsonObject &json, const QJsonObject &request, QStringList list)
    {
        Q_UNUSED(list)
        json = request;
        json[JSON_KEY_VER] = DEFAULT_JSON_VER_VALUE;
        json[JSON_KEY_REQTYPE] = JSON_REQTYPE_ENDDAY;
        json[JSON_KEY_ENDTIME] = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
        json[JSON_KEY_PRINTACTION] = "103";

        return true;
    }


    //重打小票
    static bool GetAgainPrinteJson(QJsonObject &json, const QJsonObject &request, QStringList list)
    {
        if(!list.isEmpty() && list[0].isEmpty())
            return false;
        json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
        json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_PRINTER);
        json.insert(JSON_KEY_PARTNERID, FMTool::GetJsonValue(request, JSON_KEY_PARTNERID));
        json.insert(JSON_KEY_STOREID, FMTool::GetJsonValue(request, JSON_KEY_STOREID));
        json.insert(JSON_KEY_STATIONID, FMTool::GetJsonValue(request, JSON_KEY_STATIONID));
        json.insert(JSON_KEY_OPERATORID, FMTool::GetJsonValue(request, JSON_KEY_OPERATORID));
        json.insert(JSON_KEY_FMID, list[0]);
        json.insert(JSON_KEY_PRINTACTION, QString("103"));

        return true;
    }

    //查询流水
    static bool GetFindJson(QJsonObject &json, const QJsonObject &request, QStringList list)
    {
        if(list.size() != 4 || list[0].isEmpty() || list[1].isEmpty())
            return false;

        QString tmp0 = list[0];
        QString tmp1 = list[1];
        QString tmp2 = list[2];
        QString paymentMethod = list[3];

        json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
        json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_FIND);
        json.insert(JSON_KEY_PARTNERID, FMTool::GetJsonValue(request, JSON_KEY_PARTNERID));
        json.insert(JSON_KEY_STOREID, FMTool::GetJsonValue(request, JSON_KEY_STOREID));
        json.insert(JSON_KEY_STATIONID, FMTool::GetJsonValue(request, JSON_KEY_STATIONID));
        json.insert(JSON_KEY_OPERATORID, FMTool::GetJsonValue(request, JSON_KEY_OPERATORID));
        json.insert(JSON_KEY_BEGINTIME, tmp0);
        json.insert(JSON_KEY_ENDTIME, tmp1);
        json.insert(JSON_KEY_PAGESIZE, 10);
        json.insert(JSON_KEY_PAGENUM, tmp2.toInt());
        json[JSON_KEY_METHCODE] = paymentMethod;

        return true;
    }

};

#endif // JSONFACTORY

