#include "BMFileSummaryFiller.h"

#include <BeamDataUtil/BeamMonFileSummary.h>

#include <BeamDataUtil/BDScalar.h>

#include <MessageService/MsgService.h>
CVSID("$Id: BMFileSummaryFiller.cxx,v 1.6 2006/04/19 20:58:05 rhatcher Exp $");

#include <DatabaseInterface/DbiWriter.h>
//  Instantiate associated Result Pointer class.
#include <DatabaseInterface/DbiWriter.tpl>
template class  DbiWriter<BeamMonFileSummary>;

#include <TFile.h>
#include <TSystem.h>
#include <TROOT.h>

#include <string>
using namespace std;




BMFileSummaryFiller::BMFileSummaryFiller(const BDScalar& pi)
    : fPI(pi)
    , fFileSummary(0)
{
}

void BMFileSummaryFiller::SetTclkTrigger(int event, int delay)
{
    if (fFileSummary) fFileSummary->SetTclkTrigger(event,delay);
}

void BMFileSummaryFiller::Timestamp(const VldTimeStamp& vts)
{
    double pot = fPI.GetValue();
    fFileSummary->AddSpill(vts,pot);
}

static TFile* find_tfile(const char* filename)
{
    string base_name = gSystem->BaseName(filename);
    TSeqCollection* files = gROOT->GetListOfFiles();
    TIter fitr(files);
    TFile* file=0;
    while ( ( file = (TFile*)fitr.Next() ) ) {
        string this_name = gSystem->BaseName(file->GetName());
	if (this_name == base_name) return file;
    }
    return 0;
}


void BMFileSummaryFiller::NewFile(const char* filename)
{
    // In case Commit fails.  Paranoid....
    if (fFileSummary) {
	MSG("BD",Msg::kError)
	    << "Still have a live BeamMonFileSummary for file \""
	    << fFileSummary->fFileName
	    << "\"\n";
	delete fFileSummary;
	fFileSummary = 0;
    }

    TFile* tfile = find_tfile(filename);
    if (!tfile) {
	MSG("BD",Msg::kError)
	    << "Major badness.  Could not find TFile corresponding to "
	    << filename << endl;
	return;
    }
    fFileSummary = new BeamMonFileSummary;
    fFileSummary->SetFileInfo(*tfile);
}

void BMFileSummaryFiller::Commit()
{
    if (!fFileSummary) {
	MSG("BD",Msg::kDebug)
	    << "Missing BeamMonFileSummary pointer in EndFile.  "
	    << "Empty file?!\n";
	return;
    }

    // Write file summary row to DB table
    VldRange range(Detector::kNear|Detector::kFar,SimFlag::kData,
		   fFileSummary->fFirstSpillTime,fFileSummary->fLastSpillTime
		   ,"Beam");
    VldTimeStamp now;
    DbiWriter<BeamMonFileSummary> writer(range,-1,0,now);
    writer << (*fFileSummary) ;
    writer.Close();

    delete fFileSummary;
    fFileSummary = 0;
}

