#include "QFramework/TQSampleGroupingVisitor.h"
#include "QFramework/TQSampleDataReader.h"
#include "QFramework/TQSample.h"

// #define _DEBUG_
#include "QFramework/TQLibrary.h"

#include <algorithm>    // std::sort

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQSampleGroupingVisitor:
//
// Walk through a sample folder hierarchy to create groups of samples with equal size.
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQSampleGroupingVisitor)

int TQSampleGroupingVisitor::initialize(TQSampleFolder * sampleFolder, TString& /*message*/){
  this->fReader = new TQSampleDataReader(sampleFolder);
  this->fPaths.clear();
  this->fActiveItemName = "";
  this->fActiveItemCount = 0;
  return visitLISTONLY;
}

int TQSampleGroupingVisitor::finalize(){
  delete this->fReader;
  return visitLISTONLY;
}

int TQSampleGroupingVisitor::visitSample(TQSample * sample, TString& message){
  TQCounter* cnt = this->fReader->getCounter(sample->getPath(),this->fCounterName);
  if(!cnt) return visitFAILED;
  int count = cnt->getRawCounter();
  TString path = sample->getPathWildcarded();
  delete cnt;
  if(count + this->fActiveItemCount < this->getEventLimit()){
    if(!fActiveItemName.IsNull()){
      this->fActiveItemName.Append(",");
    } 
    this->fActiveItemName.Append(path);
    this->fActiveItemCount += count;
    message = TString::Format("count is %d",this->fActiveItemCount); 
    return visitSKIPPED;
  } else {
    if(!this->fActiveItemName.IsNull()){
      this->fPaths.insert(this->fActiveItemName.Data());
      this->fActiveItemName = path;
      this->fActiveItemCount = count;
    }
    return visitOK;
  }
}

int TQSampleGroupingVisitor::visitFolder(TQSampleFolder * sample, TString& message){
  TQCounter* cnt = this->fReader->getCounter(sample->getPath(),this->fCounterName);
  if(!cnt) return visitFAILED;
  int count = cnt->getRawCounter();
  TString path = sample->getPathWildcarded();
  delete cnt;
  if(count + this->fActiveItemCount < this->getEventLimit()){
    if(!fActiveItemName.IsNull()){
      this->fActiveItemName.Append(",");
    } 
    this->fActiveItemName.Append(path);
    this->fActiveItemCount += count;
    message = TString::Format("count is %d",this->fActiveItemCount); 
    return visitSKIPPED;
  } else {
    if(!this->fActiveItemName.IsNull()){
      this->fPaths.insert(this->fActiveItemName.Data());
      this->fActiveItemName.Clear();
      this->fActiveItemCount = 0;
    }
    return visitOK;
  }
}

int TQSampleGroupingVisitor::revisitFolder(TQSampleFolder * sampleFolder, TString& /*message*/){
  if(!this->fActiveItemName.IsNull() && sampleFolder->getTagIntegerDefault(".sv.statusID",0) == visitOK){
    this->fPaths.insert(this->fActiveItemName.Data());
    this->fActiveItemName.Clear();
    this->fActiveItemCount = 0;
  }
  return visitLISTONLY;
}

 
TQSampleGroupingVisitor::TQSampleGroupingVisitor(const char* counterName, int nEvents) :
  fCounterName(counterName),
  fEventLimit(nEvents)
{
  // constructor with name argument
}

TQSampleGroupingVisitor::~TQSampleGroupingVisitor(){
  // default constructor
}


void TQSampleGroupingVisitor::setCounterName(const TString& name){
  // set the name of the counter to be used
  this->fCounterName = name;
}

void TQSampleGroupingVisitor::setEventLimit(int nEvents){
  // set the limit in the number of events
  this->fEventLimit = nEvents;
}

TString TQSampleGroupingVisitor::getCounterName(){
  // retrieve the name of the counter to be used
  return this->fCounterName;
}

int TQSampleGroupingVisitor::getEventLimit(){
  // retrieve the limit in the number of events
  return this->fEventLimit;
}

std::vector<TString> TQSampleGroupingVisitor::getPaths(){
  // retrieve the list of paths collected
  std::vector<TString> retval;
  for(auto elem:this->fPaths){
    retval.push_back(elem.c_str());
  }
  std::sort(retval.begin(),retval.end());
  return retval;
}
 TQSampleGroupingVisitor.cxx:1
 TQSampleGroupingVisitor.cxx:2
 TQSampleGroupingVisitor.cxx:3
 TQSampleGroupingVisitor.cxx:4
 TQSampleGroupingVisitor.cxx:5
 TQSampleGroupingVisitor.cxx:6
 TQSampleGroupingVisitor.cxx:7
 TQSampleGroupingVisitor.cxx:8
 TQSampleGroupingVisitor.cxx:9
 TQSampleGroupingVisitor.cxx:10
 TQSampleGroupingVisitor.cxx:11
 TQSampleGroupingVisitor.cxx:12
 TQSampleGroupingVisitor.cxx:13
 TQSampleGroupingVisitor.cxx:14
 TQSampleGroupingVisitor.cxx:15
 TQSampleGroupingVisitor.cxx:16
 TQSampleGroupingVisitor.cxx:17
 TQSampleGroupingVisitor.cxx:18
 TQSampleGroupingVisitor.cxx:19
 TQSampleGroupingVisitor.cxx:20
 TQSampleGroupingVisitor.cxx:21
 TQSampleGroupingVisitor.cxx:22
 TQSampleGroupingVisitor.cxx:23
 TQSampleGroupingVisitor.cxx:24
 TQSampleGroupingVisitor.cxx:25
 TQSampleGroupingVisitor.cxx:26
 TQSampleGroupingVisitor.cxx:27
 TQSampleGroupingVisitor.cxx:28
 TQSampleGroupingVisitor.cxx:29
 TQSampleGroupingVisitor.cxx:30
 TQSampleGroupingVisitor.cxx:31
 TQSampleGroupingVisitor.cxx:32
 TQSampleGroupingVisitor.cxx:33
 TQSampleGroupingVisitor.cxx:34
 TQSampleGroupingVisitor.cxx:35
 TQSampleGroupingVisitor.cxx:36
 TQSampleGroupingVisitor.cxx:37
 TQSampleGroupingVisitor.cxx:38
 TQSampleGroupingVisitor.cxx:39
 TQSampleGroupingVisitor.cxx:40
 TQSampleGroupingVisitor.cxx:41
 TQSampleGroupingVisitor.cxx:42
 TQSampleGroupingVisitor.cxx:43
 TQSampleGroupingVisitor.cxx:44
 TQSampleGroupingVisitor.cxx:45
 TQSampleGroupingVisitor.cxx:46
 TQSampleGroupingVisitor.cxx:47
 TQSampleGroupingVisitor.cxx:48
 TQSampleGroupingVisitor.cxx:49
 TQSampleGroupingVisitor.cxx:50
 TQSampleGroupingVisitor.cxx:51
 TQSampleGroupingVisitor.cxx:52
 TQSampleGroupingVisitor.cxx:53
 TQSampleGroupingVisitor.cxx:54
 TQSampleGroupingVisitor.cxx:55
 TQSampleGroupingVisitor.cxx:56
 TQSampleGroupingVisitor.cxx:57
 TQSampleGroupingVisitor.cxx:58
 TQSampleGroupingVisitor.cxx:59
 TQSampleGroupingVisitor.cxx:60
 TQSampleGroupingVisitor.cxx:61
 TQSampleGroupingVisitor.cxx:62
 TQSampleGroupingVisitor.cxx:63
 TQSampleGroupingVisitor.cxx:64
 TQSampleGroupingVisitor.cxx:65
 TQSampleGroupingVisitor.cxx:66
 TQSampleGroupingVisitor.cxx:67
 TQSampleGroupingVisitor.cxx:68
 TQSampleGroupingVisitor.cxx:69
 TQSampleGroupingVisitor.cxx:70
 TQSampleGroupingVisitor.cxx:71
 TQSampleGroupingVisitor.cxx:72
 TQSampleGroupingVisitor.cxx:73
 TQSampleGroupingVisitor.cxx:74
 TQSampleGroupingVisitor.cxx:75
 TQSampleGroupingVisitor.cxx:76
 TQSampleGroupingVisitor.cxx:77
 TQSampleGroupingVisitor.cxx:78
 TQSampleGroupingVisitor.cxx:79
 TQSampleGroupingVisitor.cxx:80
 TQSampleGroupingVisitor.cxx:81
 TQSampleGroupingVisitor.cxx:82
 TQSampleGroupingVisitor.cxx:83
 TQSampleGroupingVisitor.cxx:84
 TQSampleGroupingVisitor.cxx:85
 TQSampleGroupingVisitor.cxx:86
 TQSampleGroupingVisitor.cxx:87
 TQSampleGroupingVisitor.cxx:88
 TQSampleGroupingVisitor.cxx:89
 TQSampleGroupingVisitor.cxx:90
 TQSampleGroupingVisitor.cxx:91
 TQSampleGroupingVisitor.cxx:92
 TQSampleGroupingVisitor.cxx:93
 TQSampleGroupingVisitor.cxx:94
 TQSampleGroupingVisitor.cxx:95
 TQSampleGroupingVisitor.cxx:96
 TQSampleGroupingVisitor.cxx:97
 TQSampleGroupingVisitor.cxx:98
 TQSampleGroupingVisitor.cxx:99
 TQSampleGroupingVisitor.cxx:100
 TQSampleGroupingVisitor.cxx:101
 TQSampleGroupingVisitor.cxx:102
 TQSampleGroupingVisitor.cxx:103
 TQSampleGroupingVisitor.cxx:104
 TQSampleGroupingVisitor.cxx:105
 TQSampleGroupingVisitor.cxx:106
 TQSampleGroupingVisitor.cxx:107
 TQSampleGroupingVisitor.cxx:108
 TQSampleGroupingVisitor.cxx:109
 TQSampleGroupingVisitor.cxx:110
 TQSampleGroupingVisitor.cxx:111
 TQSampleGroupingVisitor.cxx:112
 TQSampleGroupingVisitor.cxx:113
 TQSampleGroupingVisitor.cxx:114
 TQSampleGroupingVisitor.cxx:115
 TQSampleGroupingVisitor.cxx:116
 TQSampleGroupingVisitor.cxx:117
 TQSampleGroupingVisitor.cxx:118
 TQSampleGroupingVisitor.cxx:119
 TQSampleGroupingVisitor.cxx:120
 TQSampleGroupingVisitor.cxx:121
 TQSampleGroupingVisitor.cxx:122
 TQSampleGroupingVisitor.cxx:123
 TQSampleGroupingVisitor.cxx:124
 TQSampleGroupingVisitor.cxx:125
 TQSampleGroupingVisitor.cxx:126
 TQSampleGroupingVisitor.cxx:127
 TQSampleGroupingVisitor.cxx:128
 TQSampleGroupingVisitor.cxx:129
 TQSampleGroupingVisitor.cxx:130
 TQSampleGroupingVisitor.cxx:131