#ifndef __OTX_JIDU_REPORT_TRANSPORTER_HPP__
#define __OTX_JIDU_REPORT_TRANSPORTER_HPP__

#include "ReportQueue.hpp"
#include <thread>
#include "ReportTransportAction.hpp"
#include <atomic>

namespace otx {
namespace jidu {

class ReportTransporter {
private:
  static ReportTransporter *mDEFAULT;
public:
  static ReportTransporter *getDefault();

public:
  ReportTransporter();
  ReportTransporter(const ReportTransporter &) = default;
  ReportTransporter &operator=(const ReportTransporter &) = default;

public:
  virtual ~ReportTransporter();

private:
  ReportQueue mQueue;
  std::thread *mThread;
  ReportTransportAction *mTransportAction;
  std::atomic_bool mIsRunning;

public:
  
  virtual void start();
  virtual void stop();
  virtual ReportQueue *getQueue();
  virtual void setAction(ReportTransportAction *action);

private:
  static void threadWork(ReportTransporter *transporter);
};

} // namespace jidu
} // namespace otx

#endif // __OTX_JIDU_REPORT_TRANSPORTER_HPP__