//
// Created by Mr.V on 2024/4/15.
//

#ifndef TRAIN_RFID_READCOMTHREAD_H
#define TRAIN_RFID_READCOMTHREAD_H
#include <QThread>
#include <QtSerialPort/QSerialPortInfo>
#include <QtSerialPort/QSerialPort>
#include "MQueue.h"
#include "common.h"
#include "ComDetect.h"
#include "TcpClient.h"
#include "ConfigUtil.h"

using namespace ai_matrix;

class ReadComThread : public QThread{
    Q_OBJECT
public:
    ReadComThread(MQueue<TrainInfo> *queueTrainInfo,
                  QObject *parent = nullptr);
    ~ReadComThread() {};
    void run() override;

private:
    MQueue<TrainInfo> *queueTrainInfo_ = nullptr;
    MQueue<TrainInfo> queueTmpTrainInfo_{}; // RFID临时信息队列
    QSerialPort *serial_;        //串口
    bool auto_reconnect_serial_ = false;
    QTimer timer_;

    ai_matrix::BaseConfig baseConfig_;
    ai_matrix::SServerConfig socketServerConfig_;

    TcpClient* tcpClient;
    QTcpSocket* tcp_ = nullptr;

    // Com口数据读取类
    ComDetect *comDetect_;
    // 打开com口标志
    bool isOpenCom = false;

    // RFID读取的数据队列
    MQueue<QString> queue_{};

    QString logRfidRecvName;
    QFile recvLog;

    QString trainTime;
    // 是否是需要识别的方向 -1:不识别  0:未确定  1:识别
    int iDirection = 0;
    // 整列车识别结果存储
    QStringList vecTrain;
    QString rfidSourceInfo;
    QString tmpRfid; //临时存储的RFID原始数据，用于防止接收的数据不完整

    // 识别方向正确标志
    bool needIdentify = false;
    // RFID识别有火车标志
    bool rfidHasTrain = false;
    // 视频识别有火车标志（使用socket服务时才有用）
    bool videoHasTrain = false;

    void initParam();


    // 创建日志目录
    bool mkRfidLog();
    void deleteOldFiles(const QString &path, int days);
    bool rnameRfidLog();
    void saveRfidLog(const QString &value);
    QString getSystemTime();

signals:
    void DebugSignals(const QString &info);
    void InfoSignals(const QString &info);
    void WarnSignals(const QString &info);
    void ErrorSignals(const QString &info);

    void statusInfoUpdate(const QString &info);

    void connect_socket(QString ip, int port);

    void openComSuccess(const bool &success);
    void closeComSuccess(const bool &success);
    void upResultType(const bool &type);
    void addResultSignals(const QString &trainInfo);
    void comeTrain(const bool &type);

    void getRfid_signals();
    void upRfid_signals(const QString &rfidInfo);
    void IdentifyType();



public slots:
    void openCom(const bool &type, const int &msec = 0);
    void readCom();
    void serialPort_error(QSerialPort::SerialPortError error);
    void getQueueDataThread();
    void IdentifyTypeUpdate();
    void upRfid(const QString &rfidInfo);
    void tryToReconnect();

    void readTestInfo(const QString &filePath);
};


#endif //TRAIN_RFID_READCOMTHREAD_H
