#ifndef FACT_DataProcessorImp
#define FACT_DataProcessorImp

#include "MessageImp.h"

struct _RUN_HEAD;
struct _EVENT;
struct _RUN_TAIL;

namespace FAD
{
    struct RunDescription;
};

typedef struct _RUN_HEAD RUN_HEAD;
typedef struct _EVENT    EVENT;
typedef struct _RUN_TAIL RUN_TAIL;

class DataProcessorImp : public MessageImp
{
    std::string fPath;
    uint64_t    fNight;
    uint32_t    fRunId;

    int Write(const Time &time, const std::string &txt, int qos=kMessage)
    {
        return fMsg.Write(time, txt, qos);
    }

protected:
    MessageImp &fMsg;
    std::string fFileName;

public:
    DataProcessorImp(const std::string &path, uint64_t night, uint32_t id, MessageImp &imp) : fPath(path), fNight(night), fRunId(id), fMsg(imp) { }
    virtual ~DataProcessorImp() { }

    virtual bool Open(const RUN_HEAD* h, const FAD::RunDescription &desc) = 0;
    virtual bool WriteEvt(EVENT *) = 0;
    virtual bool Close(RUN_TAIL * = 0) = 0;

    const std::string &GetFileName() const { return fFileName; }

    std::string GetPath() const { return fPath; }
    uint32_t    GetRunId() const { return fRunId; }

    static std::string FormFileName(const std::string &path, uint64_t night, uint32_t runid, const std::string &extension);
    std::string FormFileName(const std::string &extension)
    {
        return FormFileName(fPath, fNight, fRunId, extension);
    }
};

#include "Time.h"

class DataDump : public DataProcessorImp
{
    Time fTime;

public:
    DataDump(const std::string &path, uint64_t night, uint32_t id, MessageImp &imp) : DataProcessorImp(path, night, id, imp) { }

    bool Open(const RUN_HEAD* h, const FAD::RunDescription &d);
    bool WriteEvt(EVENT *e);
    bool Close(RUN_TAIL * = 0);
};

class DataDebug : public DataDump
{
public:
    DataDebug(const std::string &path, uint64_t night, uint32_t id, MessageImp &imp) : DataDump(path, night, id, imp) { }

    bool WriteEvt(EVENT *e);
};

#endif
