#include "QFramework/TQEventlistPrinter.h"
#include "QFramework/TQIterator.h"

// #define _DEBUG_

#include "QFramework/TQLibrary.h"
#include "QFramework/TQPathManager.h"

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQEventlistPrinter:
//
// The TQEventlistPrinter class uses an TQSampleDataReader to obtain
// an event list and to print it in ordinary text style, in latex
// style or in HTML style.
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQEventlistPrinter)


//______________________________________________________________________________________________

TQEventlistPrinter::TQEventlistPrinter() : 
TQPresenter()
{
  // Default constructor
}

//______________________________________________________________________________________________

TQEventlistPrinter::TQEventlistPrinter(TQSampleFolder * samples) : 
  TQPresenter(samples)
{
  // Constructor 
}

//__________________________________________________________________________________|___________

TQEventlistPrinter::TQEventlistPrinter(TQSampleDataReader * reader) : 
  TQPresenter(reader)
{
  // Constructor 
}

//__________________________________________________________________________________|___________

int TQEventlistPrinter::writeEventlists(const TString& jobname, const TString& outputPath, const TString& tags){
  // write all scheduled event lists
  TQTaggable taggable(tags);
  return this->writeEventlists(jobname, outputPath,taggable);
}

//__________________________________________________________________________________|___________

int TQEventlistPrinter::writeEventlists(const TString& jobname, const TString& outputPath, TQTaggable tags){
  // write all scheduled event lists
  TQTaggableIterator pitr(this->fProcesses);
  TQTaggableIterator citr(this->fCuts);
  //@tag: [verbose] If this argument tag is set to true, additional verbose printouts are enabled. Default: false.
  bool verbose = tags.getTagBoolDefault("verbose",false);
  int nlists = 0;
  //@tag: [formats,format] These tags determine the formats in which output is generated. "formats" is vector valued and takes precendence over "format" which (if neither "format" nor "formats" is provided) defaults to "txt". 
  std::vector<TString> formats = tags.getTagVString("formats");
  if(formats.size() < 1) formats.push_back(tags.getTagStringDefault("format","txt"));
  if(verbose) VERBOSEclass("writing event lists to '%s'",outputPath.Data());
  tags.setGlobalOverwrite(false);
  tags.setTagString("layout","article");
  while(pitr.hasNext()){
    TQNamedTaggable* process = pitr.readNext();
    TString path = tags.replaceInText(process->getTagStringDefault(".path",process->GetName()));
    //@tag: [.name] This process/cut tag determines the name of the process/cut which is used in titles and filenames of the output. Defaults are obtained via process/cut->GetName()
    TString name = tags.replaceInText(TQFolder::makeValidIdentifier(process->getTagStringDefault(".name",process->GetName())));
    if(TQStringUtils::findFirstNotOf(path,"| ") == -1) continue;
    while(citr.hasNext()){
      TQNamedTaggable* cut = citr.readNext();
      TString cutname = cut->getTagStringDefault(".name",cut->GetName());
      TString evtlistname = TQFolder::concatPaths(cutname,jobname);
      TQTable* evtlist = this->fReader->getEventlist(path,evtlistname);
      if(!evtlist){
        if(verbose) WARNclass("unable to retrieve event list '%s' from path '%s'",evtlistname.Data(),path.Data());
        continue;
      }
      evtlist->setTagString("colAlign","r");
      evtlist->setTagString("title",name + " @ " + cutname);
      TString filename = jobname+"-"+cutname+"-"+name;
      for(size_t i=0; i<formats.size(); i++){
        TString filepath = TQFolder::concatPaths(outputPath,filename)+"."+formats[i];
	filepath = TString(TQPathManager::getPathManager()->getLocalPath(filepath));
        bool ok = evtlist->write(filepath,formats[i],tags);
        if(!ok){
          if(verbose) WARNclass("unable to write event list '%s' to '%s'",evtlistname.Data(),filepath.Data());
          continue;
        } else if(verbose){
          VERBOSEclass("successfully written event list '%s' to '%s'",evtlistname.Data(),filepath.Data());
        }
      }
      delete evtlist;
      nlists++;
    }
    citr.reset();
  }
  return nlists;
}
 TQEventlistPrinter.cxx:1
 TQEventlistPrinter.cxx:2
 TQEventlistPrinter.cxx:3
 TQEventlistPrinter.cxx:4
 TQEventlistPrinter.cxx:5
 TQEventlistPrinter.cxx:6
 TQEventlistPrinter.cxx:7
 TQEventlistPrinter.cxx:8
 TQEventlistPrinter.cxx:9
 TQEventlistPrinter.cxx:10
 TQEventlistPrinter.cxx:11
 TQEventlistPrinter.cxx:12
 TQEventlistPrinter.cxx:13
 TQEventlistPrinter.cxx:14
 TQEventlistPrinter.cxx:15
 TQEventlistPrinter.cxx:16
 TQEventlistPrinter.cxx:17
 TQEventlistPrinter.cxx:18
 TQEventlistPrinter.cxx:19
 TQEventlistPrinter.cxx:20
 TQEventlistPrinter.cxx:21
 TQEventlistPrinter.cxx:22
 TQEventlistPrinter.cxx:23
 TQEventlistPrinter.cxx:24
 TQEventlistPrinter.cxx:25
 TQEventlistPrinter.cxx:26
 TQEventlistPrinter.cxx:27
 TQEventlistPrinter.cxx:28
 TQEventlistPrinter.cxx:29
 TQEventlistPrinter.cxx:30
 TQEventlistPrinter.cxx:31
 TQEventlistPrinter.cxx:32
 TQEventlistPrinter.cxx:33
 TQEventlistPrinter.cxx:34
 TQEventlistPrinter.cxx:35
 TQEventlistPrinter.cxx:36
 TQEventlistPrinter.cxx:37
 TQEventlistPrinter.cxx:38
 TQEventlistPrinter.cxx:39
 TQEventlistPrinter.cxx:40
 TQEventlistPrinter.cxx:41
 TQEventlistPrinter.cxx:42
 TQEventlistPrinter.cxx:43
 TQEventlistPrinter.cxx:44
 TQEventlistPrinter.cxx:45
 TQEventlistPrinter.cxx:46
 TQEventlistPrinter.cxx:47
 TQEventlistPrinter.cxx:48
 TQEventlistPrinter.cxx:49
 TQEventlistPrinter.cxx:50
 TQEventlistPrinter.cxx:51
 TQEventlistPrinter.cxx:52
 TQEventlistPrinter.cxx:53
 TQEventlistPrinter.cxx:54
 TQEventlistPrinter.cxx:55
 TQEventlistPrinter.cxx:56
 TQEventlistPrinter.cxx:57
 TQEventlistPrinter.cxx:58
 TQEventlistPrinter.cxx:59
 TQEventlistPrinter.cxx:60
 TQEventlistPrinter.cxx:61
 TQEventlistPrinter.cxx:62
 TQEventlistPrinter.cxx:63
 TQEventlistPrinter.cxx:64
 TQEventlistPrinter.cxx:65
 TQEventlistPrinter.cxx:66
 TQEventlistPrinter.cxx:67
 TQEventlistPrinter.cxx:68
 TQEventlistPrinter.cxx:69
 TQEventlistPrinter.cxx:70
 TQEventlistPrinter.cxx:71
 TQEventlistPrinter.cxx:72
 TQEventlistPrinter.cxx:73
 TQEventlistPrinter.cxx:74
 TQEventlistPrinter.cxx:75
 TQEventlistPrinter.cxx:76
 TQEventlistPrinter.cxx:77
 TQEventlistPrinter.cxx:78
 TQEventlistPrinter.cxx:79
 TQEventlistPrinter.cxx:80
 TQEventlistPrinter.cxx:81
 TQEventlistPrinter.cxx:82
 TQEventlistPrinter.cxx:83
 TQEventlistPrinter.cxx:84
 TQEventlistPrinter.cxx:85
 TQEventlistPrinter.cxx:86
 TQEventlistPrinter.cxx:87
 TQEventlistPrinter.cxx:88
 TQEventlistPrinter.cxx:89
 TQEventlistPrinter.cxx:90
 TQEventlistPrinter.cxx:91
 TQEventlistPrinter.cxx:92
 TQEventlistPrinter.cxx:93
 TQEventlistPrinter.cxx:94
 TQEventlistPrinter.cxx:95
 TQEventlistPrinter.cxx:96
 TQEventlistPrinter.cxx:97
 TQEventlistPrinter.cxx:98
 TQEventlistPrinter.cxx:99
 TQEventlistPrinter.cxx:100
 TQEventlistPrinter.cxx:101
 TQEventlistPrinter.cxx:102
 TQEventlistPrinter.cxx:103
 TQEventlistPrinter.cxx:104