﻿#ifndef __OTX_FLASH_ECUFlasherManager_HPP__
#define __OTX_FLASH_ECUFlasherManager_HPP__

#include "ParallelECUFlasher.hpp"
#include "SequenceECUFlasher.hpp"
#include <map>
#include "vbf/VBFParserSmall.h"

namespace otx {
	namespace flash {

		class ECUFlasherManager : virtual public ECUFlasherImpl, virtual public ECUFlasherEventHandler {
		public:
			ECUFlasherManager();
			explicit ECUFlasherManager(int parallelSize);
			ECUFlasherManager(const ECUFlasherManager& right) = default;
			ECUFlasherManager& operator=(const ECUFlasherManager& right) = default;
			virtual ~ECUFlasherManager();

		private:
			// 按优先级分类的ECU列表集合。
			std::map<int, std::vector<ECU*>*> mPriorityECUs;
			// 根据名称检索。
			std::map<std::string, ECU*> mECUs;
			// 记录ECU添加的顺序。
			std::vector<std::string> mSequenceECUNames;
			bool mStarted;
			TaskPool* mPool;

		public:
			virtual bool download() override;
			virtual unsigned long long getRemainTime(ECU* ecu) override;
			virtual void addECU(const std::string& name, // 友好的名称。
				const std::string& id,   // 唯一的标识符。
				const std::string& dbLogicalLinkName,
				int priority,
				int securityAccessMode = 0,
				int signatureMode = 0,//0 prod和dev都用； 1：dev  2:prod
				int securityAccess = 1, //是否进行安全校验
				int installVerify = 1); //是否进行安装校验

			virtual void addECUFile(const std::string& ecuName, int fileType, const std::string& pinCode, const std::string& keyInfo, VBFParserSmall* parser);
			virtual void addECUFile(const std::string& ecuName, const std::string& filePath, int fileType, size_t fileSize, const std::string& pinCode, const std::string& keyInfo);

			virtual bool getProjectPath(std::string& filepath);
			virtual bool getcmd(std::string ecuName, std::vector<std::string>& vecCmd);

		protected:
			virtual bool downloadFile(ECU* ecu, File* ecuFile) override;
			void delay(int ms);
		public:
			virtual void onECUDownloadStart(ECUFlasherECUEventArg& arg) override;
			virtual void onECUDownloadEnd(ECUFlasherECUEventArg& arg) override;

			virtual void onECUResetStart(ECUFlasherECUEventArg& arg) override;
			virtual void onECUResetEnd(ECUFlasherECUEventArg& arg) override;

			virtual void onFileDownloadStart(ECUFlasherFileEventArg& arg) override;
			virtual void onFileDownloadEnd(ECUFlasherFileDownloadEndEventArg& arg) override;
			virtual void onFileDownloadProgress(ECUFlasherFileDownloadProgressEventArg& arg) override;
		};
	} // namespace flash
} // namespace otx

#endif // __OTX_FLASH_ECUFlasherManager_HPP__