#pragma once
#ifndef _VBFHEADER_H_
#define _VBFHEADER_H_

#include <string>
#include <vector>

using namespace std;

class VBFHeader
	{
	private:
		std::string m_strHeader;
		std::string VBF_VERSION_TOKEN = "vbf_version";
		std::string SW_PARTNUM_TOKEN = "sw_part_number";
		std::string SW_VERSION_TOKEN = "sw_version";
		std::string SW_PARTTYPE_TOKEN = "sw_part_type";
		std::string FILE_CHECKSUM_TOKEN = "file_checksum";
		std::string ECU_ADDRESS_TOKEN = "ecu_address";
		std::string DESCRIPTION_TOKEN = "description";
		std::string SW_PARTNUM_CURR_TOKEN = "sw_current_part_number";
		std::string SW_VERSION_CURR_TOKEN = "sw_current_version";
		std::string DATA_FORMAT_TOKEN = "data_format_identifier";
		std::string ERASE_TOKEN = "erase";
		std::string CALL_TOKEN = "call";
		std::string VERIF_BLOCK_ROOT_HASH_TOKEN = "verification_block_root_hash";
		std::string VERIF_BLOCK_START_TOKEN = "verification_block_start";
		std::string VERIF_BLOCK_LENGTH_TOKEN = "verification_block_length";
		std::string SW_SIGNATURE_DEV_TOKEN = "sw_signature_dev";
		std::string SW_SIGNATURE_TOKEN = "sw_signature";
		std::string PARAM_SETTINGS_TOKEN = "parameter_settings";
		std::string LINEFEED = "__LF__";
		std::string m_strVBFVersion;
		std::string m_strDescription;
		std::string m_strSWPartNumber;
		std::string m_strSWVersion;
		std::string m_strSWPartType;
		std::string m_strDataFormatIdentifier;
		std::string m_strECUAddress;
		std::string m_strCall;
		std::string m_strFileChecksum;
		int m_nMaxHeader = 65536;
		int m_nEofHeader = -1;
		int CRC32_POLYNOM = -306674912;
		int CRC32_INITVAL = -1;
		int CRC32_FINXOR = -1;
		std::string m_strSWCurrVersion;
		std::string m_strSWCurrPartNo;
		vector<std::string> m_vecListErases;
		std::string m_strBlockRootHash;
		std::string m_strBlockStart;
		std::string m_strBlockLength;
		std::string m_strSWSigDev;
		std::string m_strSW_sig;

	public:
		VBFHeader();
		bool ParseHeader(vector<unsigned char>& buffer);

		int getHeaderLength();

		bool convertHeader();

		void dumpVBFInfo();

		std::string getVersion();

		std::string getSWPartNum();

		std::string getSWPartType();

		std::string getSWVersion();

		std::string getFileChecksum();

		std::string getEcu_address();

		bool hasDescription();

		bool hasCall();

		std::string getCall();

		bool hasErase();

		vector<std::string> getListOfErase();

		bool hasDataFormatIdentifier();

		std::string getDataFormatIndetifier();

		bool has_SWCurrVersion();

		std::string getSWCurrVersion();

		bool has_SWCurrPartNo();

		std::string getSWCurrPartNo();

		bool has_VerifBlockRootHash();

		std::string getVerifBlockRootHash();

		bool has_VerifBlockStart();

		std::string getVerifBlockStart();

		bool has_VerifBlockLength();

		std::string getVerifBlockLength();

		bool has_SWSignatureDev();

		std::string getSWSignatureDev();

		bool has_SWSignature();

		std::string getSWSignature();

		std::string getheaderString();

	private:
		int FindEOFHeader(vector<unsigned char>& buffer);
		bool getHeader(vector<unsigned char>& buffer);

		int findNextTokenInfo(std::string in, std::string tok, int start);

		std::string getTokenInfo(const std::string& in, const std::string& tok, int start);

		std::string getTokenInfo(const std::string& in, const std::string& tok);

		std::string getVBFVersion();

		std::string formatDesc(std::string in);

		std::string getPDescription();

		std::string getPSWPartNumber();

		std::string getPSWPartNumberCurrent();

		std::string getPSWPartVersion();

		std::string getPSWPartVersionCurrent();

		std::string getPSWPartType();

		std::string getPDataFormatIdentifier();

		std::string getHexNumberString(std::string in);

		std::string getPECUAddress();

		std::string getPBlockRootHash();

		std::string getPBlockStart();

		std::string getPBlockLength();

		std::string getPSWSignatureDev();

		std::string getPSWSignature();

		vector<std::string> formatErase(std::string in);

		vector<std::string> getPErase();

		std::string getPCall();

		std::string getPFileChecksum();
};

#endif
