#ifndef MainWindow_H
#define MainWindow_H

#include <QWidget>
#include <QtSerialPort/QSerialPortInfo>
#include <QtSerialPort/QSerialPort>
#include <QDebug>
#include <QString>
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#include <windows.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <chrono>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <QWaitCondition>
#include <ctime>
#include <codecvt>
#include <Iphlpapi.h>
#include <cstdlib>
#include <QObject>
#include <QTcpsocket>
#include <direct.h>
#include <algorithm>
#include <QDateTime>
#include "httplib.h"
#include "json.h"
#include <QInputDialog>
#include <QSystemTrayIcon>
#include <QCloseEvent>
#include <QAction>
#include <QCloseEvent>
#include <qmenu.h>
#include <QFile>
#include <QDir>
#include <thread>
#include <QMessageBox>
#include <QTimer>
#include <queue>
#include <mutex>
#include <thread>
#include <chrono>
#include "common.h"
#include "ConfigUtil.h"
#include "ComDetect.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void initParam();

    bool upWeb(std::string &carriageType, std::string &carriageNumber, std::string &carriageOrder, std::string &time);
    bool getToken();

    QString getSystemTime();

private:
    QString trainTime;

    QString logRfidRecvName;
    QFile recvLog;
    bool mkRfidLog();
    bool rnameRfidLog();
    void saveRfidLog(const QString &value);

    QString configPath_; //
    ai_matrix::BaseConfig baseConfig_;
    ai_matrix::InterfaceConfig interfaceConfig_;
    std::string webToken;        //授权信息


    QSerialPort *serial_;        //串口

    // 表格model
    QStandardItemModel *resultTableModel_ = nullptr;
    // 打开com口标志
    bool isOpenCom = false;
    // Com口数据读取类
    ComDetect comDetect_;
    // com口列表
    QList<QString> comList;
    // 整列车识别结果存储
    QStringList vecTrain;
    MQueue<QString> queue_{};  // RFID读取的数据队列
    QString tmpRfid; //临时存储的RFID原始数据，用于防止接收的数据不完整

    // 识别方向正确标志
    bool needIdentify = false;
    // 获取当前时间
    QDateTime currentTime_ = QDateTime::currentDateTime();
    void logDebug(const QString& message);
    void logInfo(const QString& message);
    void logWarn(const QString& message);
    void logError(const QString& message);

    // 获const 取串口列表&
    QList<QString> getComList();
    // 将所有串口const 展示在下&拉列表
    void initComboBox();
    // 创建日志目录
    static bool mkLogDir();
    // 获取QStandardItem
    QStandardItemModel* getStandardItemModel();
    QStandardItem* getStandardItem(const QString &value);
private:

    QMenu* m_pTrayMennu;            //系统托盘右键菜单项
    QSystemTrayIcon* m_pSystemTray; //系统托盘图标

    //右键菜单栏选项
    QAction* m_pActionShow;
    QAction* m_pActionQuit;
    void creat_menu();
    void creat_action();
    void changeEvent(QEvent *event);
    void on_ShowMainAction();
    void on_ExitAppAction();
    void closeEvent(QCloseEvent *event);

signals:
    void getRfid_signals();
    void upRfid_signals();
private slots:
    void openComClicked();
    void readCom();
    void getQueueDataThread();
    void upRfid();
    void serialPort_error(QSerialPort::SerialPortError error);
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);


private:
    Ui::MainWindow *ui;
};


#endif // MainWindow_H
