#pragma once
#include "CivSimulResultCache.h"
#include "CivNewInp.h"

class CivDbConn;
/**
水力模拟计算类
*/
class CivHydrSimulation
{
public:
	explicit CivHydrSimulation();
	explicit CivHydrSimulation(CivDbConn* dbConn);
	~CivHydrSimulation();

	/**
	 *@biref 注册数据库
	 *@dbConn：连接数据库指针
	 */
	void registDb(CivDbConn* dbConn);

	/**
	*@brief 水力模拟
	*/
	bool hdyrSimulation();

	/**
	*@brief 水质模拟，水龄，化学物质
	*/
	bool qualitySimulation();

	/**
	*@brief 追踪分析，本质仍然式水质分析
	*@snNode：追踪的节点号
	*@hours: 小时数
	*/
	bool trackingSimulation(char* snNode, int hours);

	/**
	*@brief 导出inp文件
	*@analyType: 水质分析类型：水龄，追踪，化合物，none
	*@qulityName:  追踪节点值，或者化合物质
	*/
	bool convertInp(const QualityAnalyType analyType, const std::string& qulityName);

	/**
	*@brief 获取追踪结果值
	*@hours：追踪的小时数
	*/
	void getTrackingResult(int hours, std::string& result);

	/**
	*@brief 同一天只保留最后一次模拟的结果值，须清除当前之前模拟的结果值
	*@dbConn: 数据库连接对象指针
	*@date: 日期
	*/
	bool  clearSamePeriodValue(CivDbConn* dbConn, const std::string& date);

	/**
	*@brief 及时更新最新模拟的数据到gis管网模型中，默认更新零时刻
	*@dbConn: 数据库连接对象指针
	*@time: 时段
	*/
	bool updateLastestDataToGisNet(CivDbConn* dbConn,const std::string& time);

	/**
	*@brief 刷新最新的模拟的数据
	*/
	bool brushingResult();
	/*
		inp文件名，输出文件名，二进制文件名设置和获取
	*/
	inline char*  getInpFile();
	inline void setInpFile(const std::string& inpFile);

	inline char* getRptFile();
	inline void setRptFile(const std::string& rptFile);

	inline char* getBinFile();
	inline void setBinFile(const std::string& binFile);

private:

	/**
	*@brief 水质计算服务
	*/
	bool qualityCompute();
	void getNodeResult(short time);
	void getLinkResult(short time);
    void getNodeQuality(short time);
    void getLinkQuality(short time);

private:
	CivDbConn* mDbConn;
	CivSimulResultCache mResultCache; // 存储模拟结果缓存类

	std::string mInpFile; // inp文件名
	std::string mRptFile; // 报告文件名
	std::string mBinFile;// 二进制文件名
};
