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

using namespace std;
/**
     优化调度计算类
*/
class CivSchedulingCompute
{
public:

	// 调度类型
	enum SchdulingType
	{
		PumpScheduling, // 水泵调度
		PBVScheduling // 根据压力制动阀调度
	};

	explicit CivSchedulingCompute(SchdulingType schedulingType);

	// 设置监测点
	void setMonitors(const vector<string>& monitor);

	// 读入inp文件
	bool openFile(const string& inpFILE);

	// 水力计算
	bool calculate();

	// 保存为inp文件
	bool saveInpFile(char* inpFile);

	// 结束计算，关闭文件句柄
	void close();

	// 更新水泵的转速比
	void updatePumpSpeed(const map<string, float>& pumpSpeed);

	/**
	* @brief 获取某个具体时段的计算的监测点的模拟值
	* @param [time] 时段
	* @param [monitorMap] 具体某个时段的监测值
	*/
	void getMonitorsValue(int time, map<string, double>& monitorMap);

	// 更改压力制动阀压力设置
	void updatePBVSettings(const string& sn, double pressure);

	// 获取每个时刻消耗的总能量
	float totalEnergy(int index);

	// 清除上一轮的值（很重要）
	void clearLastVals();

private:
	// 保存计算的值
	void saveResult(int time);

	// 获取计算的水泵的能耗
	void getPumpEnergy(int time);

private:
	std::string mRptFile;
	std::string mBinFile;
	std::string mInpFile;

	// 水泵编号和code的映射
	vector<string> mMonitors;

	 // 错误吗
	int  mErrcode = 0;

	// 更新水泵的转速比
	map<string, float> mPumpSpeed;

	// 水泵消耗的能量
	vector<map<string, float>> mPumpEnergy;

	// 存储测点的计算值
	vector<map<string, double>> mMonitorsValue;

	SchdulingType mChdulingType;
};
