#ifndef MAINFORM_H
#define MAINFORM_H

#include <QDialog>
#include <QTableWidget>
#include "alertForm.h"
#include "Model/orderObject.h"
#include "settingForm.h"
#include "detailForm.h"
#include <QTimer>
#include "DTools/sysTray.h"
#include "padForm.h"
#include <QListWidget>
#include "bstatusForm.h"
#include "bstatusItem.h"
#include "dishesForm.h"
#include "dailyreportForm.h"

namespace Ui {
class MainForm;
}

class MainForm : public QWidget
{
    Q_OBJECT

public:
    explicit MainForm(QWidget *parent = 0);
    ~MainForm();

    /* 功能:自定义的显示函数
     * 参数:NULL
     * 返回:NULL
     * */
    void MyShow();

protected:
    void mouseMoveEvent(QMouseEvent * event);
    void mousePressEvent(QMouseEvent * event);
    void mouseReleaseEvent(QMouseEvent * event);

private:
    Ui::MainForm *ui;

    // 记录左键按下去后是否移动过
    bool m_bMouseMove;
    // 记录左键是否按下去
    bool m_bMousePress;
    // 拖动前鼠标坐标
    QPoint m_lastMousePos;
    // 此次拖动一共移动的距离
    QPoint m_absMove;

    // 时间定时器
    QTimer m_timeTimer;

    // 记录上一次选中的表单和按钮
    QPushButton *m_prevBtn;
    QTableWidget *m_prevTable;

    // 所有的表
    QList<QTableWidget*> m_tableList;

    // 通知窗口
    AlertForm *m_alertForm;
    // 设置窗口
    SettingForm *m_settingForm;
    // 订单详情窗口
    DetailForm *m_detailForm;
    // 数字键盘窗口
    PadForm *m_padForm;
    // 搜索结果窗口
    QListWidget *m_resultForm;

    // 当前选中的表
    QTableWidget *m_currentTable;
    // 菜品管理界面
    dishesForm *m_dishesForm;

    // 门店营业管理界面
    BStatusForm *m_bunisStatusForm;
    DailyReportForm *m_dailyReportForm;

    // 置顶计数器
    int m_raiseIndex;

    // 托盘图标
    SysTray m_tray;
    // 订单号长度
    int m_orderIdSize;

    /* 功能:还原按钮和表
     * 参数:NULL
     * 返回:NULL
     * */
    void _RevertBtnTable();
    /* 功能:控制Table的排序
     * 参数:[1]是否开启排序
     * 返回:NULL
     * */
    void _SetTablesSortEnable(bool bEnable);
    /* 功能:根据订单状态获取对应的Tab按钮
     * 参数:[1]订单状态
     * 返回:对应的Tab按钮
     * */
    QPushButton *_GetTabBtnByOrderStatus(int orderStatus);

signals:
    /* 功能:处理订单
     * 参数:[1]操作动作名[2]订单编号[3]配送员信息
     * 返回:NULL
     * */
    void processOrder(const QString& operation, const QString& orderId);

    /* 功能:通知悬浮窗显示
     * 参数:NULL
     * 返回:NULL
     * */
    void showFloatForm();

    /* 功能:通知悬浮窗隐藏
     * 参数:NULL
     * 返回:NULL
     * */
    void hideFloatForm();

    /* 功能:通知悬浮窗开始提示
     * 参数:[1]提示类型 0新订单1退款申请
     * 返回:NULL
     * */
    void startRemind(int type);

    /* 功能:通知悬浮窗停止提示
     * 参数:NULL
     * 返回:NULL
     * */
    void stopRemind();

    /* 功能:获取订单详情
     * 参数:NULL
     * 返回:NULL
     * */
    void getOrderDetails(const QString& orderId);

    /* 功能:获取 EC-MOP 订单详情
     * 参数:NULL
     * 返回:NULL
     * */
    void getEcMopOrderDetails(const QString& orderId, const QString& channel);

    /* 功能:开启流程
     * 参数:NULL
     * 返回:NULL
     * */
    void flowStart();

    /* 功能:获取菜品信息
     * 参数:NULL
     * 返回:NULL
     * */
    void PullDishes();

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

    /* 功能:获取日结数据
     * 参数:NULL
     * 返回:NULL
     * */
    void getDayReport();

    /* 功能:同步服务端全部订单;
     * 参数:NULL
     * 返回:NULL
     * */
    void GetOMSAllOrders();

    /* 功能:发送自测订单请求;
     * 参数:NULL
     * 返回:NULL
     * */
    void sendSelfCheck();


private slots:
    /* 功能:初始化
     * 参数:NULL
     * 返回:NULL
     * */
    void _Init();

    /* 功能:用来绑定 QTableWidget horizontalHeader click 排序前，信号与槽的初始化;
     * 参数:NULL
     * 返回:NULL
     * */
    void _TableWidgetHeaderClickConnect();

    /* 功能:设置当前时间
     * 参数:NULL
     * 返回:NULL
     * */
    void onSetCurrentTime();
    /* 功能:Tab页按钮点击对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void onMainTabBtnClicked();
    /* 功能:Tab页按钮点击对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void onMainProcBtnClicked();
    /* 功能:设置按钮对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void on_mainBtnSet_clicked();

    /* 功能:隐藏按钮对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    //void on_mainBtnHide_clicked();

    /* 功能:上翻按钮对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void on_mainBtnUp_clicked();
    /* 功能:下翻按钮对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void on_mainBtnDown_clicked();
    /* 功能:点击订单对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void onMainTableItemClicked(QTableWidgetItem *item);
    /* 功能:点击搜索对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void on_mainEdtSearch_clicked();
    /* 功能:键盘数字点击处理
     * 参数:NULL
     * 返回:NULL
     * */
    void onNumClicked(const QString& num);
    /* 功能:键盘数字删除处理
     * 参数:NULL
     * 返回:NULL
     * */
    void onNumDelete();

    /* 功能:键盘获取EC-MOP订单详情处理
     * 参数:NULL
     * 返回:NULL
     * */
    void onDisplayEcMopOrder();

    /* 功能:点击搜索结果订单对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void onSearchResultItemClicked(QListWidgetItem * item);


    void on_mainBtnDishManager_clicked();

    void on_mainBtnSyncOrder_clicked();

    void on_mainBtnSelfCheck_clicked();

public slots:
    /* 功能:隐藏按钮对应动作
     * 参数:NULL
     * 返回:NULL
     * */
    void on_mainBtnHide_clicked();

    /* 功能:隐藏通知窗口
     * 参数:NULL
     * 返回:NULL
     * */
    void onHideAlert();
    /* 功能:显示通知窗口
     * 参数:[1]窗口类型[2]显示信息
     * 返回:NULL
     * */
    void onShowAlert(AlertForm::Type type, const QString& msg);
    /* 功能:设置门店信息
     * 参数:[1]门店编号
     * 返回:NULL
     * */
    void onSetStoreInfo(const QString& storeId);
    /* 功能:设置收银员信息
     * 参数:[1]收银员编号
     * 返回:NULL
     * */
    void onSetCashierInfo(const QString& cashierInfo);
    /* 功能:设置门店营业状态
     * 参数:[1]营业状态
     * 返回:NULL
     * */
    void onSetOpeStatus(const QString& status);
    /* 功能:设置门店网络状态
     * 参数:[1]网络状态
     * 返回:NULL
     * */
    void onSetNetStatus(const QString& status);
    /* 功能:更改订单列表信息
     * 参数:[1]订单对象[2]旧订单的状态
     * 返回:NULL
     * */
    void onChangeOrderStatus(OrderObject *orderObject, int oldStatus);
    /* 功能:显示订单详情
     * 参数:[1]订单对象
     * 返回:NULL
     * */
    void onShowOrderDetails(OrderObject* orderObject);
    /* 功能:显示订单搜索结果
     * 参数:[1]订单搜索结果
     * 返回:NULL
     * */

    /* 功能:QTableWidget horizontalHeader click 触发信号 sectionClicked(int)对应的槽 函数;
     * 参数:NULL
     * 返回:NULL
     * */
    void _onTableWidgetHeaderClick(int index);


    void onShowSearchOrderResult(const QMap<QString, QString> &orderIdList);
    void onOrderClear(const QString& orderId,const int& oldstatus);
    void onSetDailyReportData(QJsonObject json);
};

#endif // MAINFORM_H
