#ifndef _VIHGO_H
#define _VIHGO_H

#include <vector>
#include <map>
#include <htslib/sam.h>

class Vihgo
{
	public:
		Vihgo();
		Vihgo( std::string , std::string , std::string , std::string ,  std::string , std::string, std::string,std::string,std::string,std::string, int, int , int , double, double, bool);
		int mainLoop();
		int getGenome();
		int getGenes();
		int getAnnotation();
		int readRunControl();
		int readSample();
		int variantCalling();
		std::string getControlBamFile();
		std::string getBamFile();
		bool isInGeneList( std::string );
		bool getCountStop();
		std::string getConsensusFile();

		bool isAnnotationDefined();
		std::vector<std::string> getAnnotationFiles();

		private :

		std::string sampleName;
		std::string inputBamFile;
		std::string integraseFile;
		std::string proteaseFile;
		std::string retrotranscriptaseFile;
		std::string referenceFile;
		std::string outputFile;
		std::string codonResultFile;
		std::string csFile;
		std::string inRunControlBam;
		std::string geneFile;

		int depthThreshold;
		int nbThread;
		int loggingLevel;

		double ratioThreshold;
		double pvalueThreshold;

		bool countStop;
		bool annotationIsOk;

		std::map<std::string, std::map<int, char> > referenceSequence;
		std::map<std::string, std::map< std::string , std::string> > genes;
		std::map<std::string, std::map< int , std::string> > referenceCodon;
		std::map<std::string, std::map< int , std::string> > protCodon;
		std::map<std::string, std::map<int , int> > refProtCorresp;
		std::map<std::string, std::map< std::string , std::string> > knownMutationTable;

		// method
		void displayGenome();
		void displayGenes();
		void displayCodons();
		void displayData( std::string );
		void displayReferenceCodons();
		void writeCodonFile( std::string );
		std::string isInGene( std::string , int );
		bool detectStopInRead( bam1_t * , int32_t , std::string );
		void writeConsensus();
		std::string getChrFromProt( std::string );
		bool isThereAControl();
		std::string getAAfromCodon( std::string );
		char getBase( int );
		char getReferenceBase( std::string , int );



		// map of codon
		std::map<std::string , std::string > codonTable;

		// control data
		std::map<std::string , std::map<int , std::map< std::string , int> > >  controlData;
		// sample data
		std::map<std::string , std::map<int , std::map< std::string , int> > >  sampleData;


};
#endif