/********************
 * 流程控制
 * *****************/

#ifndef FLOWCONTROL_H
#define FLOWCONTROL_H

#include <QObject>
#include "Network/billSocket.h"
#include "Model/orderObject.h"
#include "Model/deliverObject.h"
#include "Model/cashierObject.h"
#include "Model/dishesObject.h"
#include "alertForm.h"
#include <QMap>
#include <QMutex>
#include <QSqlDatabase>


typedef struct DailyStatement
{
    QString channel;
    int total_number;
    int total_fee;
    int refund_number;
    int refund_total_fee;
    int total_projected_revenue;
    int product_fee_zps;
    int send_fee_zps;
    int discount_platform_fee_zps;
    int discount_shop_fee_zps;
    int package_fee_zps;
    int service_fee_zps;
    int product_fee;
    int send_fee;
    int discount_platform_fee;
    int discount_shop_fee;
    int package_fee;
    int service_fee;

}DailyStatement;

class FlowControl : public QObject
{
    Q_OBJECT
public:
    static FlowControl& GetInstance();

    inline QString  storeName(){return m_storeName;}
    inline QString storeId(){return m_storeId;}

private:
    FlowControl();
    FlowControl(FlowControl const&);
    FlowControl& operator=(FlowControl const&);

private:
    // 门店信息
    QString m_storeName;
    QString m_storeId;
    QString m_posId;
    QString m_cashierId;
    QDateTime m_bDate;
    // 网络通信
    bool neterror=true;//标记之前的网络
    BillSocket *m_loginSocket;
    BillSocket *m_pullOrderSocket;
    BillSocket *m_procOrderSocket;
    BillSocket *m_syncStockSocket;
    BillSocket *m_pullDishesSocket;
    // 拉取订单的时间戳
    QString m_timestamp;
    // 订单容器
    QMap<QString, OrderObject*> m_ordersMap;
    // 当前收银员
    CashierObject m_cashierObject;

    // 所有菜品信息<分类, <菜品ID, 具体菜品> >
    QMap<QString, QMap<QString, dishesObject> > m_dishesMap;

    // viewId _ orderId
    QMap<QString, QString> m_view2Id;

    int netErrorIndex;

    QList<OrderObject*> m_billList;
    QMutex m_mutex;

    // 本地订单数据数据库对象
    QSqlDatabase m_db;

signals:
    /* 功能:连接数据库完成
     * 参数:[1]是否成功[2]错误信息
     * 返回:NULL
     * */
    void connectDbFinsh(bool bSuccess, const QString& msg);
    /* 功能:隐藏通知窗口
     * 参数:NULL
     * 返回:NULL
     * */
    void hideAlert();
    /* 功能:显示通知窗口
     * 参数:[1]窗口类型[2]显示信息
     * 返回:NULL
     * */
    void showAlert(AlertForm::Type type, const QString& msg);
    /* 功能:设置主界面门店信息
     * 参数:[1]门店号
     * 返回:NULL
     * */
    void setStoreInfo(const QString& storeId);
    /* 功能:设置门店营业状态
     * 参数:[1]营业状态
     * 返回:NULL
     * */
    void setOpeStatus(const QString& status);
    /* 功能:设置门店网络状态
     * 参数:[1]网络状态
     * 返回:NULL
     * */
    void setNetStatus(const QString& status);
    /* 功能:更改订单显示列表
     * 参数:[1]订单对象[2]旧订单的状态
     * 返回:NULL
     * */
    void changeOrderStatus(OrderObject* orderObject, int oldStatus=-100);
    /* 功能:显示配送员选择窗
     * 参数:[1]订单编号[2]配送员信息
     * 返回:NULL
     * */
    void showDeliverPickForm(const QString& orderId, const QList<DeliverObject>& delivers);
    /* 功能:显示收银员选择窗
     * 参数:[1]收银员信息
     * 返回:NULL
     * */
    void showCashierPickForm(const QList<CashierObject>& cashiers);
    /* 功能:显示订单详情界面
     * 参数:[1]收银员信息
     * 返回:NULL
     * */
    void showOrderDetails(OrderObject* orderObject);
    /* 功能:显示订单搜索结果
     * 参数:[1]搜索结果
     * 返回:NULL
     * */
    void showSearchOrderResult(const QStringList& orderIdList);
    void startNetErrorRemind();
    void stopNetErrorRemind();
    void startRemind(int type);

    // 通知菜品管理界面初始化菜品信息
    void iniDishesData(QMap<QString, QMap<QString, dishesObject> >);

    // 通知门店营业管理界面初始化信息
    void initChannelsData(QStringList);


    // 通知菜品管理界面操作成功刷新界面 [1]平台 [2]菜品ID [3]状态
    void processDishiesSuccssful(QStringList, QString, int);

    // 通知营业状态管理界面操作成功
    void setStoreOperatingStatusFinsh(QString);

    // 通知显示日结信息
    void showDailyStatement(QList<DailyStatement> infos);


private slots:
    /* 功能:获取门店信息
     * 参数:NULL
     * 返回:是否成功
     * */
    bool _GetStoreInfo();
    /* 功能:登录
     * 参数:NULL
     * 返回:是否成功
     * */
    bool _Login();
    /* 功能:拉取订单
     * 参数:NULL
     * 返回:是否成功
     * */
    bool _PullOrder();
    /* 功能:获取配送员
     * 参数:[1]订单编号
     * 返回:是否成功
     * */
    bool _GetDelivers(const QString& orderId);
    /* 功能:确认订单
     * 参数:[1]订单编号[2]配送员信息
     * 返回:是否成功
     * */
    bool _ConfirmOrder(const QString& orderId, const DeliverObject& deliverObj);
    /* 功能:拒绝订单
     * 参数:[1]订单编号[2]拒单原因
     * 返回:是否成功
     * */
    bool _RefuseOrder(const QString& orderId, int refuseCode);
    /* 功能:送出订单
     * 参数:[1]订单编号
     * 返回:是否成功
     * */
    bool _SendOrder(const QString& orderId, const DeliverObject &deliverObj);
    /* 功能:完成订单
     * 参数:NULL
     * 返回:是否成功
     * */
    bool _CompleteOrder(const QString& orderId);
    /* 功能:拒绝退单
     * 参数:NULL
     * 返回:是否成功
     * */
    bool _RefuseRefund(const QString& orderId);
    /* 功能:同意退单
     * 参数:NULL
     * 返回:是否成功
     * */
    bool _AgreeRefund(const QString& orderId);
    /* 功能:获取收银员
     * 参数:[1]收银员列表
     * 返回:成功true失败false
     * */
    bool _GetCashiers(QList<CashierObject>& cashiersList);
    /* 功能:同步库存
     * 参数:NULL
     * 返回:成功true失败false
     * */
    bool _SynStock();
    /* 功能:检测收银员合法性
     * 参数:NULL
     * 返回:合法true不合法false
     * */
    bool _CheckCashiers();

    /* 功能:提交销售单写入结果
     * 参数:NULL
     * 返回:是否成功
     * */
    bool _ReportBillEntryResult(const QString& orderId, int status, const QString& error);

    /* 功能:获取Json对象的字符
     * 参数:NULL
     * 返回:Json字符串
     * */
    QString _GetJsonStr(const QJsonObject& json);
    bool _RefundOrder(const QString& orderId, const QString& reason);

    void _PostBill();


public slots:
    /* 功能:开启流程控制器
     * 参数:NULL
     * 返回:NULL
     * */
    void onFlowStart();
    /* 功能:连接数据库
     * 参数:[1]IP[2]用户名[3]密码[4]库名
     * 返回:NULL
     * */
    void onConnectDb(const QString& host, const QString& username,
                     const QString& password, const QString& dbname);
    /* 功能:处理订单
     * 参数:[1]操作动作名[2]订单编号[3]配送员姓名
     * 返回:NULL
     * */
    void onProcessOrder(const QString& operation, const QString& orderId, const DeliverObject& deliverObj);
    /* 功能:获取在班收银员信息
     * 参数:NULL
     * 返回:NULL
     * */
    void onGetOnDutyCashiers();
    /* 功能:更新收银员信息
     * 参数:NULL
     * 返回:NULL
     * */
    void onUpdateCashier(const CashierObject& cashier);
    /* 功能:获取订单详情
     * 参数:NULL
     * 返回:NULL
     * */
    void onGetOrderDetails(const QString& orderId);
    /* 功能:重新录单
     * 参数:NULL
     * 返回:NULL
     * */
    void onReEntryOrder(const QString& orderId);
    /* 功能:搜索订单
     * 参数:[1]搜索内容
     * 返回:NULL
     * */
    void onSerachOrder(const QString& text);
    void onRefund(const QString& orderId, const QString& reason);

    /* 功能:获取菜品信息
     * 参数:NULL
     * 返回:NULL
     * */
    void onPullDishes();
    /* 功能:获取菜品信息
     * 参数:NULL
     * 返回:NULL
     * */
    void onUpdDishes(QStringList channelCode, QString disheId, int status);

    /* 功能:获取菜品信息
     * 参数:NULL
     * 返回:NULL
     * */
    void onUpdDishesForRef(QString channelCode, QMap<QString, int> dishes);

    /* 功能:获取门店营业状态
     * 参数:NULL
     * 返回:NULL
     * */
    void onGetBusinessStatus();

    /* 功能:获取门店日结信息
     * 参数:NULL
     * 返回:NULL
     * */
    void onGetDailyStatement();

    /* 功能:设置门店营业状态
     * 参数:NULL
     * 返回:NULL
     * */
    void onSetStoreOperatingStatus(QString channel, int business_status);
};

#endif // FLOWCONTROL_H
