#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 <QListView>
#include <QMenuBar>
#include <QStatusBar>
#include <QtConcurrent>
#include <queue>
#include <mutex>
#include <thread>
#include <chrono>
#include "common.h"

//#include "ComDetect.h"

#include "UpResultThread.h"
#include "ReadComThread.h"


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
using namespace ai_matrix;

class MainWindow : public QWidget
{
Q_OBJECT

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

    void logDebug(const QString& message);
    void logInfo(const QString& message);
    void logWarn(const QString& message);
    void logError(const QString& message);
    // 创建日志目录
    bool mkLogDir();

    void initParam();

    QString getSystemTime();

    // 获const 取串口列表&
    QList<QString> getComList();
    // 将所有串口const 展示在下&拉列表
    void initComboBox();

    // 获取QStandardItem
    QStandardItemModel* getStandardItemModel();
    QStandardItem* getStandardItem(const QString &value);

private:

    UpResultThread *upResultThread;
    ReadComThread *readComThread;

    QString logRfidRecvName;
    QFile recvLog;

    QString configPath_; //
    ai_matrix::BaseConfig baseConfig_;
    ai_matrix::InterfaceConfig interfaceConfig_;

    std::string webToken;        //授权信息

    // 表格model
    QStandardItemModel *resultTableModel_ = nullptr;
    // 打开com口标志
    bool isOpenCom = false;
    bool auto_reconnect_serial_ = false;
    // Com口数据读取类
//    ComDetect comDetect_;
    // com口列表
    QList<QString> comList;
    // 整列车识别结果存储
    QStringList vecTrain;
    MQueue<QString> queue_{};  // RFID读取的数据队列
    MQueue<TrainInfo> queueTrainInfo_{}; // RFID读取的磁钢信息队列

    QString rfidSourceInfo;
    QString tmpRfid; //临时存储的RFID原始数据，用于防止接收的数据不完整

    // 获取当前时间
    QDateTime currentTime_ = QDateTime::currentDateTime();

private:

    QStatusBar* statusBar;
    QLabel *statusInfo;

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

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

signals:
    void openCom_signals(const bool &type, const int &msec = 0);
    void readTestRfid_signals(const QString &filePath);

private slots:
    void openComClicked();
    void openComResult(const bool &success);
    void closeComResult(const bool &success);
    void upResultType(const bool &type);
    void comeTrain(const bool &success);
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
    void readTestInfo();

    void statusInfoUpdate(const QString &info);

    void DebugSlots(const QString &info);
    void InfoSlots(const QString &info);
    void WarnSlots(const QString &info);
    void ErrorSlots(const QString &info);

private:
    Ui::MainWindow *ui;
};


#endif // MainWindow_H
