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

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

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

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

	/**
	*@brief 瞬时计算
	*/
	bool hdyrInstantSimulation();

	bool hdyrCompute();

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

	/**
	*@brief 获取分析结果
	*@return 分析结果字符串
	*/
	std::string getAnalysisResults();

	/**
	*@brief 追踪分析，本质仍然式水质分析
	*@param snNode：追踪的节点号
	*@param hours: 小时数
	*/
	bool trackingSimulation(char* snNode, int hours);
	void getDataByTime(int time ,NodeResultItems& nodeItems, LinkResultItems& linkItems);

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

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

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

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

	/**
	*@brief 刷新最新的模拟的数据
	*/
	bool brushingResult();

	void setQualityAnalyType(QualityAnalyType analyType) { mQuaLityType = analyType; }

	/*
		inp文件名，输出文件名，二进制文件名设置和获取
	*/	
	inline void setInpFile(const std::string& inpFile);
	inline void setRptFile(const std::string& rptFile);	
	inline void setBinFile(const std::string& binFile);

private:
	inline char* getRptFile();
	inline char* getInpFile();
	inline char* getBinFile();

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

private:
	CivDbConn* mDbConn;
	CivSimulResultCache mResultCache; // 存储模拟结果缓存类
	QualityAnalyType mQuaLityType = ANALYSIS_RESERVE;
	std::string mInpFile; // inp文件名
	std::string mRptFile; // 报告文件名
	std::string mBinFile;// 二进制文件名
};
