// Copyrigth Xtooltech @ 2023- All rights reserved.(LXH)

#ifndef __REPORT_RECORD_COLLECTOR_HPP__
#define __REPORT_RECORD_COLLECTOR_HPP__

#include <string>
#include <ctime>
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif

#include <mutex>
#include "StationDataReportRecord.hpp"
#include "StationResultReportRecord.hpp"
#include "PrintResultReportRecord.hpp"
#include "ReportCollectorEventHandler.hpp"

namespace otx {
namespace jidu {

class ReportRecordCollector {

public:
  explicit ReportRecordCollector();
  ReportRecordCollector(const ReportRecordCollector &) = default;
  ReportRecordCollector &operator=(const ReportRecordCollector &) = default;
  virtual ~ReportRecordCollector();

private:
  StationDataReportRecord *mStationDataReportRecord;
  //StationResultReportRecord *mStationResultReportRecord;
  //PrintResultReportRecord *mPrintResultReportRecord;
  std::mutex mBlockLock;
  std::mutex mItemLock;
  //config::ReportConfiguration *mConfiguration;
  std::vector<ReportCollectorEventHandler *> mEventHandlers;
  uint64_t mCollectStartTime;
  uint64_t mCollectEndTime;
private:
  std::string mCarConfig;
  std::string mTPMSId;
  std::string mBncmFeedbackResult;
  std::string mSshStatus;
  std::string mChargingIsOpen;
  std::string mGloveboxIsOpen;
  std::string mElectricity;

public:
  /**
   * @brief 创建新的报告，新的数据环境。
   * 
   */
  virtual void collectBegin();
  /**
   * @brief 清空已有的数据。
   * 
   */
  virtual void collectEnd();

// 基本信息设置。

  virtual void collectSerialNo(const std::string &v);
  virtual void collectMixNo(const std::string &v);
  virtual void collectVehicleType(const std::string &v);
  virtual void collectVin(const std::string &v);
  virtual void collectStation(const std::string &v);
  virtual void collectReworkStation(const std::string &v);
  virtual void collectResultType(const std::string &v);
  virtual void collectCell(const std::string &v);

  virtual void collectCarConfig(const std::string &v);
  virtual void collectTpmsId(const std::string &v);
  virtual void collectBncmFeedbackResult(const std::string& v);
  virtual void collectSshStatus(const std::string& v);
  virtual void collectChargingIsOpen(const std::string& v);
  virtual void collectGloveboxIsOpen(const std::string& v);
  virtual void collectElectricity(const std::string& v);

  // block控制。

  virtual void blockBegin(const std::string &categoryId, const std::string &categoryName,const std::string &blockId, const std::string& blockName);
  virtual void blockEnd(const std::string &categoryId, const std::string &blockId);

  // 小项和步骤控制。

  virtual void collectItemStepOK(const std::string& blockId, const std::string& itemId, const std::string& itemName, const std::string& ecuName, const std::string& ecuAddr, const std::string& expectedData, unsigned char* request, int sizeOfRequest, unsigned char* response, int sizeOfResponse);
  virtual void collectItemStepNOK(const std::string& blockId, const std::string& itemId, const std::string& itemName, const std::string& ecuName, const std::string& ecuAddr, const std::string& expectedData, const std::string& failReason, unsigned char* request, int sizeOfRequest, unsigned char* response, int sizeOfResponse);

  // 事件相关。
  virtual void addEventHandler(ReportCollectorEventHandler *handler);
  virtual void removeEventHandler(ReportCollectorEventHandler *handler);

private:
  std::string datetimeNowString();

  virtual void postBlockCompleted(StationDataReportRecord *newBlock);
  virtual void postStationResultCompleted(StationResultReportRecord *newResult);
  virtual void postPrintResultCompleted(PrintResultReportRecord *newResult);

  virtual StationDataBlock *getBlockById(const std::string &blockId);
  virtual std::string toHex(unsigned char *data, int index, int size);
  virtual void generate02();
  virtual void generate03();
  virtual void getInfoOfBlocksAndItems(int *countOfBlocks, int *countOfItems, int *isFailed, int *countOfFailedBlocks, int *countOfFailedItems);
  virtual uint64_t now();
  virtual std::string formatCollectDuration();
};

} // namespace jidu
} // namespace otx

#endif /* __REPORT_RECORD_COLLECTOR_HPP__ */
