#pragma once
#include <string>
#include <map>

/**
	水力动态计算类
*/
class CivDynamicCompute
{
public:
	typedef std::string String;
	typedef String& StringRef;
	typedef const StringRef  ConstStringRef;

	CivDynamicCompute();

	/**
	* @brief 加载inp文件
	* @param [fileName]  inp文件名
	* @return 打开加载inp文件成功返回True，否则返回False
	*/
	bool openFile(ConstStringRef fileName);

	/**
	* @brief 开始执行水质计算，做一些初始化工作
	*/
	bool beginCompute();

	/**
	* @brief 结束水质计算，做一些清理工作
	*/
	void endCompute();

	/**
	* @brief 获取某个四段某个时段的
	* @param [startTime] 开始时间
	* @param [endTime] 结束时刻
	*/
	bool compute(int startTime, int endTime);

	/**
	* @brief 更新水泵的转速比
	* @param [pcode] 水泵标识
	* @param [speeds] 转速比数值
	*/
	void updatePumpSpeed(ConstStringRef pcode, float speeds);

	/**
	* @brief 需要更新的水池的水质
	* @param [waterSources] 水源编号和水质
	*/
	void updateQuality(const std::map<std::string, float>& waterSources);
	void setStartTime(const std::string& startTime) { mStartTime = startTime; }
	void setEndTime(const std::string& endTime) { mEndTime = endTime; }

	/**
	 *@brief 获取模拟结果
	 * @param[resultMap] 存储模拟的结果
	 */
	void simulResult(std::map<std::string, std::map<std::string, float>>& resultMap) const;
private:
	/**
	 * @brief 给水源添加余氯量
	 * @param [sourceType] 水源类型，水池或者水库
	 * @param [pid] 水源的编码
	 * @param [density] 余氯浓度
	 */
	void addWaterResiChlorine(const std::string& pid, float density);

	/**
	*@brief 初始化水质，将所有节点水质初始化为0
	*/
	void resetQuality();

	/**
	* @brief 保存模拟结果
	* @param 需要保存哪个时段的数据
	*/
	bool  saveResult(int iTime);

	/**
	*@brief 获取整点时刻
	*/
	std::string onTheHour(int iTime);
private:
	String mRptFile;
	String mBinFile;
	String mInpFile;
	int  mErrcode;

	std::string mStartTime;
	std::string mEndTime;

	// 水质模拟结果
	std::map<std::string, std::map<std::string, float>> mSimulQualityMap; 

	// 水池水质
	std::map<std::string, float> mWaterSourcesMap; // 水质
};
