#ifndef MAMBA_DECODER
#define MAMBA_DECODER

#include <stdint.h>
#include <vector>
#include <fstream>

class mamba_decoder
{

  private:
	bool& m_isAType;

    int nBeetles;
    int nSubsets;
    int nCH;
    int startADC;
    int stopADC;
    int nADCs;
      
    uint64_t _pack_id;
    uint64_t _trig_id;
    uint64_t _timestamp;
    uint64_t _ts_timestamp;
    uint64_t _coincidence_id;
    uint64_t _padding;
    std::vector<int>  _ADC;
    std::vector<int>  _bHeader0;
    std::vector<int>  _bHeader1;
    std::vector<int>  _bHeader2;
    std::vector<int>  _bHeader3;
    std::vector<int>  _bHeader3P1;
    std::vector<int>  _bHeader3P2;
    unsigned int _TDC;
    double _baseline;
    
  public:

    mamba_decoder(	bool& isAType);

    virtual ~mamba_decoder();
    
    bool eof(){ return ifile->eof(); }

    bool open(const char * filename);
    void close();
    void rewind(){ ifile->clear(); ifile->seekg(0, std::ios::beg); }

    std::ifstream * ifile;  
    bool find_mamba_header();
    bool check_mamba_footer();  
    
    int find_beetle_header( int * subsADCs, int thr) ;

    bool read_event();
 
    uint64_t PackID(){ return _pack_id; }
    uint64_t TrigID(){ return _trig_id; }
    uint64_t Timestamp(){ return _timestamp; }
    uint64_t TsTimestamp(){ return _ts_timestamp; }
    uint64_t CoincidenceID(){ return _coincidence_id; }
    uint64_t Padding(){ return _padding; }
    std::vector<int> ADC(){
    	return _ADC;
    }
    std::vector<int> BHeader0() {
      return _bHeader0; 
    }
    std::vector<int> BHeader1() {
      return _bHeader1; 
    }
    std::vector<int> BHeader2() {
      return _bHeader2; 
    }
    std::vector<int> BHeader3() {
      return _bHeader3; 
    }
    std::vector<int> BHeader3P1() {
      return _bHeader3P1; 
    }
    std::vector<int> BHeader3P2() {
      return _bHeader3P2; 
    }
    unsigned int TDC(){ return _TDC; }

};


#endif
