#include "BDSpliceModule.h"

#include <JobControl/JobCModuleRegistry.h>
#include <MessageService/MsgService.h>
#include <RawData/RawBeamMonHeaderBlock.h>
#include <DataUtil/GetRawBlock.h>

CVSID("$Id: BDSpliceModule.cxx,v 1.1 2005/08/05 14:42:08 bv Exp $");
JOBMODULE(BDSpliceModule, "BDSplice", "Pass records based on their spill time");

BDSpliceModule::BDSpliceModule()
    : fBegin(VldTimeStamp::GetBOT())
      , fEnd(VldTimeStamp::GetEOT())
{
}

BDSpliceModule::~BDSpliceModule()
{
}


const Registry& BDSpliceModule::DefaultConfig() const
{
    static Registry r;
    if (r.Size()) return r;
    r.Set("BeginTime",0);
    r.Set("EndTime",(int)((time_t)-1));
    r.SetName(Form("%s.config.default",this->JobCModule::GetName()));
    return r;
}

void BDSpliceModule::Config(const Registry& cfg)
{
    int t;
    if (cfg.Get("BeginTime",t) && t != fBegin.GetSec())
	fBegin = VldTimeStamp(t);
    if (cfg.Get("EndTime",t) && t != fEnd.GetSec())
	fEnd = VldTimeStamp(t);
}
    
JobCResult BDSpliceModule::Ana(const MomNavigator* mom)
{
    static bool inrange = false;

    const RawBeamMonHeaderBlock* header =
	DataUtil::GetRawBlock<RawBeamMonHeaderBlock>(mom);

    if (!header) {
	MSG("BDSpliceModule",Msg::kWarning)
	    << "No RawBeamMonHeaderBlock, failing record\n";
	return JobCResult::kFailed;
    }

    VldTimeStamp now = header->GetTimeStamp();

    JobCResult pf = JobCResult::kPassed;

    if (now < fBegin) pf = JobCResult::kFailed;
    if (now > fEnd)   pf = JobCResult::kFailed;

    if (inrange && pf.Failed()) {
        MSG("BDSpliceModule",Msg::kInfo)
            << "Leaving range at " << now << endl;
    }
    if (!inrange && pf.Passed()) {
        MSG("BDSpliceModule",Msg::kInfo)
            << "Entering range at " << now << endl;
    }
    if (pf.Passed()) inrange = true;
    else inrange = false;

    return pf;
}

