#ifndef CIVNEWINP_H
#define CIVNEWINP_H
#include <sstream>
#include <string>
#include "CivAssembly.h"
#include <list>


// 水质分析类型枚举
typedef enum
{
	ANALYSIS_TRACE = 1,	//追踪分析
	ANALYSIS_AGE = 2,	//水龄分析
	ANALYSIS_CONCENTRATION = 3,	//化合物分析
	ANALYSIS_RESERVE = 4, //系统保留，用户不能使用
}QualityAnalyType;

// 组件常量
#define OPTIONS "OPTIONS"
#define TIMES "TIMES"
#define REACTIONS "REACTIONS"
#define ENERGY "ENERGY"
#define REPORT "REPORT"
#define COORDINATES "COORDINATES"

/**
   转inp文件类
*/
class CivNewInp
{
public:
	explicit CivNewInp();
	~CivNewInp();
	
	bool writeToFile(const std::string& fileName);
	void setTtitle(const std::string& title);
	void setNode(const CivNode& node);
	void setPipes(const CivPipe& pipes);
	void setTank(const CivTank& tank);
	void setReservoirs(const  CivReservoirs& res);
	void setValves(const CivValve& valve);
	void setPumps(const CivPumps& pumps);
	void setEmitters(const CivEmitters& mitters);

	// 系统运行
	void setCurves(const CivCurves& cureves);
	void setPatterns(const CivPatterns& patterns);	
	void setStatus(const CivStatus& status);
	void setControls(const std::string& control);
	void setRules(const std::string& ruleName, const std::string& rules);
	void setDemands(const CivDemands& demands);

	// 水质
	void setQuality(const CivQuality& quality);
	void setSources(const CivSources& sources);
	void setMixing(const CivMixing& mixing);

	// 选项和报表 ，统一读取参数表
	void setReactions(const CivParameter& params);
	void setOptions(const CivParameter& params);
	void setTimes(const CivParameter& params);
	void setReport(const CivParameter& params);
	void setEnergy(const CivParameter& params);

	void setParamter(const CivParameter& params, const std::string& type);


	//管网地图/标签
	void setCoordnates(const CivCoordinates& coords);
	void setVertices();
	void setLabels(const CivLabels& labels);
	void setBackDrop();
	void setTags(const CivTags& tags);

private:
	void inline writeString(const std::string& s);
	void inline writeStringFormat(const std::string& s, const std::string& sep="\t");
	void inline writeHead(const std::string& head);
	std::string currentTime();

private:
	std::ostringstream mTextStream; 
	std::map<std::string, void (CivNewInp::*)(const CivParameter&)> mParamMap; // 参数类型映射
};
#endif // !CIVNEWINP_H

