#ifndef JSONFACTORY
#define JSONFACTORY

#include "requestmodel.h"
#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 AlipayRequest &request, QStringList list = QStringList())
    {
        if(type == pay)
            return GetPayJson(json, request, list);
        if(type == refund)
            return GetRefundJosn(json, request, list);
        if(type == endday)
            return GetDayEndJson(json, request, list);
        if(type == againprint)
            return GetAgainPrinteJson(json, request, list);
        if(type == finds)
            return GetFindJson(json, request, list);
        return false;
    }

    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 shift:
            return GetShiftJson(json, reqJson, list);
        case finds:
            return GetFindJson(json, reqJson, list);
        case againprint:
            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 AlipayRequest &request, QStringList list)
    {
        if(list.size() != 1 || list[0].isEmpty())
            return false;

        json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
        json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_PAY);
        json.insert(JSON_KEY_PARTNERID, FMTool::GetString((const void *)&(request.PlatNo), 4).toInt());
        json.insert(JSON_KEY_STOREID, FMTool::GetString((const void *)&(request.StoreNo), 20));
        json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
        json.insert(JSON_KEY_OPERATORID, FMTool::GetString((const void *)&(request.CashierNo), 6));
        json.insert(JSON_KEY_TRANSID, FMTool::GetString((const void *)&(request.CashTraceNo), 6));
        json.insert(JSON_KEY_BUSINESSDATE, FMTool::GetString((const void *)&(request.BusinessDay), 8));
        json.insert(JSON_KEY_CODE, list[0]);
        json.insert(JSON_KEY_TRANSAMOUNT,  FMTool::GetString((const void *)&(request.Amount), 12).toInt());
        json.insert(JSON_KEY_UNAMOUNT,  FMTool::GetString((const void *)&(request.non_sale_Amount), 12).toInt());
        json.insert(JSON_KEY_PARTORDERID, FMTool::GetString((const void *)&(request.Reserved1), 64));

        int len = FMTool::GetString((const void *)&(request.item_line_qty), 2).toInt();
        QJsonArray prod;

        qDebug() << "--------" << len;

        for(int i = 0; i < len; ++i) {
            QJsonObject object;
            struct product *pro = (struct product *)request.item_information[i];

            object.insert(JSON_KEY_PRODUCTS_CONSUMENUM, FMTool::GetString((const void *)&(pro->buyCount), 4));
            object.insert(JSON_KEY_PRODUCTS_PID, FMTool::GetString((const void *)&(pro->productID), 8));
            object.insert(JSON_KEY_PRODUCTS_NAME, FMTool::GetString((const void *)&(pro->productName), 20));
            object.insert(JSON_KEY_PRODUCTS_SALESTYPE, DEFAULT_JSON_PRODUCTS_NORMAL);

            QString typebuf = FMTool::GetString((const void *)&(pro->isCombo), 1);

            if(typebuf == 0)
                object.insert(JSON_KEY_PRODUCTS_SALESTYPE, DEFAULT_JSON_PRODUCTS_FREE);

            object.insert(JSON_KEY_PRODUCTS_PRICE, FMTool::GetString((const void *)&(pro->unitPrice), 8));
            prod.append(object);
        }

        json.insert(JSON_KEY_PRODUCTS, prod);

        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 AlipayRequest &request, QStringList list)
    {
        if(list.size() != 1 || list[0].isEmpty())
            return false;

        json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
        json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_REFUND);
        json.insert(JSON_KEY_PARTNERID, FMTool::GetString((const void *)&(request.PlatNo), 4).toInt());
        json.insert(JSON_KEY_STOREID, FMTool::GetString((const void *)&(request.StoreNo), 20));
        json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
        json.insert(JSON_KEY_OPERATORID, FMTool::GetString((const void *)&(request.CashierNo), 6));
        json.insert(JSON_KEY_REFUNDID, FMTool::GetString((const void *)&(request.CashTraceNo), 6));
        json.insert(JSON_KEY_BUSINESSDATE, FMTool::GetString((const void *)&(request.BusinessDay), 8));
        json.insert(JSON_KEY_FMID, list[0]);
        json.insert(JSON_KEY_REFUNDAMOUT,  FMTool::GetString((const void *)&(request.Amount), 12).toInt());
        json.insert(JSON_KEY_PARTORDERID, FMTool::GetString((const void *)&(request.Reserved1), 64));

        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 GetDayEndJson(QJsonObject &json, const AlipayRequest &request, QStringList list)
    {
        json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
        json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_ENDDAY);
        json.insert(JSON_KEY_PARTNERID, FMTool::GetString((const void *)&(request.PlatNo), 4).toInt());
        json.insert(JSON_KEY_STOREID, FMTool::GetString((const void *)&(request.StoreNo), 20));
        json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
        json.insert(JSON_KEY_ENDTIME, FMTool::GetString((const void *)&(request.BusinessDay), 8).append( FMTool::GetString((const void *)&(request.TransTime), 6)));
        json.insert(JSON_KEY_PARTORDERID, FMTool::GetString((const void *)&(request.Reserved1), 64));
        json.insert(JSON_KEY_PRINTACTION, QString("103"));

        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] = "101";
        json[JSON_KEY_PRINTACTION] = "103";

        return true;
    }

    static bool GetShiftJson(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] = "102";
        return true;
    }

    //重打小票
    static bool GetAgainPrinteJson(QJsonObject &json, const AlipayRequest &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::GetString((const void *)&(request.PlatNo), 4).toInt());
        json.insert(JSON_KEY_STOREID, FMTool::GetString((const void *)&(request.StoreNo), 20));
        json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
        json.insert(JSON_KEY_OPERATORID, FMTool::GetString((const void *)&(request.CashierNo), 6));
        json.insert(JSON_KEY_FMID, list[0]);
        json.insert(JSON_KEY_PRINTACTION, QString("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 AlipayRequest &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 cur = QDateTime::currentDateTime().toString("hh:mm:ss");

        tmp0.append(" 00:00:00");
        tmp1.append(QString(" ") + cur);

        json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
        json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_FIND);
        json.insert(JSON_KEY_PARTNERID, FMTool::GetString((const void *)&(request.PlatNo), 4).toInt());
        json.insert(JSON_KEY_STOREID, FMTool::GetString((const void *)&(request.StoreNo), 20));
        json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
        json.insert(JSON_KEY_OPERATORID, FMTool::GetString((const void *)&(request.CashierNo), 6));
        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.insert(JSON_KEY_METHCODE, 10001);

        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

