#ifndef CIVTYPES_H
#define CIVTYPES_H

#include <map>
#include<string>
#include <vector>
#include <set>

typedef  std::string   Str;
typedef  const std::string& StrQuote;

#define Tables std::vector<Str>

#define PIPELINE Str("管段")
#define PIPENODE Str("节点")
#define RESIVOIR Str("水库")
#define TANK Str("水池")
#define PUMP Str("水泵")
#define VALVE Str("阀门")

#define NODERESULTTABLE Str("__node_result__")
#define PIPERESULTTABLE Str("__pipe_result__")
#define PATTERNTABLE Str("__pattern__")
#define CURVETABLE Str("__curve__")
#define OPTIONTTABLE Str("__parameter__")

#define PRV_TYPE Str("稳压阀")
#define PSV_TYPE Str("减压阀")
#define PBV_TYPE Str("压力制动阀")
#define FCV_TYPE Str("流量控制阀")
#define TCV_TYPE Str("节流控制阀")
#define GPV_TYPE Str("常规阀门")


// 管点
#define Node std::map<Str,Str>
#define Nodes std::vector<Node>

// 管线集合
#define Componet std::map<Str,Str>
#define Componets std::vector<Componet>

// 字段过滤
#define FiledFilter std::map<Str,std::set<Str>>

// 组件类型
enum SectType {
	_TITLE, _JUNCTIONS, _RESERVOIRS, _TANKS, _PIPES, _PUMPS,
	_VALVES, _CONTROLS, _RULES, _DEMANDS, _SOURCES, _EMITTERS,
	_PATTERNS, _CURVES, _QUALITY, _STATUS, _ROUGHNESS, _ENERGY,
	_REACTIONS, _MIXING, _REPORT, _TIMES, _OPTIONS,
	_COORDS, _VERTICES, _LABELS, _BACKDROP, _TAGS, _END
};

// 阀门类型
enum ValvesType
{
	PRV,   /* 减压阀   */
	PSV,   /* 稳压阀   */
	PBV,   /* 压力制动阀 */
	FCV,   /* 流量控制阀 */
	TCV,  /*节流控制阀 */
	GPV  /* 常规阀门 */
};

// 水泵参数
enum PumpParameter
{
	POWER,  // 定速能量水泵的功率数值，hp(kW)
	HEAD,  // 描述了水泵扬程与流量关系的曲线ID
	SPEED,  // 相对速度设置（额定速度为1.0，0意味着水泵关闭）
	PATTERN  // 时间模式的ID，描述了速度设置怎样随时间变化
};


// [REPORT] 
// 描述模拟生成的输出报表内容。
struct Report {
	Str PAGESIZES;
	Str NODES; // NONE/ALL/node1 node2 ... 
	Str LINKS; // NONE/ALL/link1 link2 ... 
	Str STATUS;
	Str SUMMARY; // 
	Str ENERGY;
};


/****************************** 管网物理组件，参数字段****************************************************/
// 水泵
//[PUMPS]
//; ID              	Node1           	Node2           	Parameters
struct PumpFields {
	/**
	* POWER——定速能量水泵的功率数值，hp(kW)
	* HEAD——描述了水泵扬程与流量关系的曲线ID
	* SPEED——相对速度设置（额定速度为1.0，0意味着水泵关闭）
	* PATTERN——时间模式的ID，描述了速度设置怎样随时间变化
	*/
	Str ID = "编号";
	Str node1 = "本点号"; // 与水泵连接的输入段本点号
	Str node2 = "上点号"; // 水泵连接的下游管段
	Str power = "功率";  // 定速能量水泵的功率数值，hp(kW)
	Str head = "扬程曲线";
	Str speed = "速度"; // 相对速度设置（额定速度为1.0，0意味着水泵关闭）
	Str pattern = "水泵曲线";// 时间模式的ID，描述了速度设置怎样随时间变化
};

//[VALVES]
//; ID              	Node1           	Node2           	Diameter    	Type	Setting     	MinorLoss
struct ValvesFields {
	Str ID = "编号"; // 水泵表的本点号
	Str node1 = "上点号"; // 与水泵连接的输入段本点号
	Str node2 = "本点号"; // 水泵连接的下游管段
	Str Diameter = "管径";// 直径
	Str type = "类型"; // 阀门类型
	Str setting = "参数设置"; // 不同阀门对应不同参数
	Str minorLoss = "局部损失系数"; //
};

// 水库字段
struct ResivoirFields {
	Str ID = "本点号";
	Str Elev = "高程";
	Str Head = "水头";
	Str X_Coord = "横坐标";
	Str Y_Coord = "纵坐标";
	Str Pattern = "水头模式曲";
	Str Flow = "流出流量";
};

//;ID  Node1   Node2   Length   Diameter  	Roughness  MinorLoss  Status
struct PipeFields {
	Str ID = "编号";
	Str Node1 = Str("上点号");
	Str Node2 = Str("本点号");
	Str Length = Str("管长");
	Str Diameter = Str("管径"); // 管径
	Str Roughness = Str("摩阻系数"); //
	Str MinorLoss = Str("局部水头损");
	Str Status = Str("状态");
};

// 节点 
struct  JunctionsFields {
	Str ID = "本点号";
	Str Elev = "高程";
	Str Demand = "需水量";
	Str Pattern = "需水量模式";
	Str X_Coord = "横坐标";
	Str Y_Coord = "纵坐标";
	Str InitQual = "初始水质";
};

// 模式表字段
struct PatternFields {
	Str Name = "模式名";
	Str Value = "值";
	Str NetName = "管网名";
};

// 曲线定义表
struct CurvesFields {
	Str Label = "曲线名";
	Str XCoord = "x";
	Str YCoord = "y";
	Str Type = "类型";
};

// 参数选项表
struct ParameterFileds {
	Str name = "参数名";
	Str val = "参数值";
	Str type = "参数类型";/*
	[REACTIONS]
	[SOURCES]
	[MIXING]
	[OPTIONS]
	[TIMES]
	[REPORT]
*/
	Str netName = "管网名";
};

// 水池
//[TANKS] ;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
struct TanksFields {
	Str ID = "本点号";
	Str Elev = "高程";
	Str InitLevel = "初始水位";
	Str MinLevel = "最低水位";
	Str MaxLevel = "最高水位";
	Str Diameter = "直径";
	Str MinVol = "容量";
	Str VolCurve = "容积曲线";
	Str X_Coord = "横坐标";
	Str Y_Coord = "纵坐标";
};

/********************************end **************************************************/
struct NodeFieldName
{
	Str Number = "本点号";
	Str dFlow = "流量";
	Str dHead = "水头";
	Str dPressure = "压力";
	Str dElevation = "标高";
	Str dDemand = "实际需水量";
	Str dTankVolume = "水池容量";
	Str dTankMaxVolume = "水池最大容量";
	Str dTankLevel = "液位高度";
	Str dQuality = "水质";
	Str dDate = "日期";
	Str dInterval = "时段";
	Str dModifyTime = "修改时间";
};

struct LinkFiledName
{
	Str szNo = "编号";
	Str dFlow = "流量";
	Str nFlowDirect = "流向";
	Str dVelocity = "流速";
	Str dHeadloss = "水头损失";
	Str dUnitHeadloss = "单位水头损";
	Str dFromNodHeadloss = "上点水头";
	Str dToNodHeadloss = "本点水头";
	Str dLocalHeadloss = "局部水头损";
	Str dFrictionHeadloss = "摩擦水头损";
	Str szStatus = "状态";
	Str dQuality = "水质";
	Str dDate = "日期";
	Str dInterval = "时段";
	Str dModifyTime = "修改时间";
};

//  水力计算管点结果缓存 
struct  NodeResultItem
{
	char szNo[32]; // 本点号
	float dFlow; // 流量
	float dHead; // 水头
	float dPressure; // 压力
	float dElevation; // 标高
	float dDemand; // 实际需水量
	float dTankVolume; // 水池容量
	float dTankMaxVolume; // 水池最大容量
	float dTankLevel; // 液位高度
	float dQuality;// 水质
	char dDate[32];// 日期
	int dInterval; // 时段
};

// 水力计算管线结果缓存
struct  LinkResultItem
{
	char szNo[32]; // 编号
	float dFlow; // 流量
	short nFlowDirect; // 流向
	float dVelocity; // 流速
	float dHeadloss; // 水头损失
	float dUnitHeadloss; // 单位水头损失
	float dFromNodHeadloss; // 上点水头
	float dToNodHeadloss; // 本点水头
	float dLocalHeadloss; // 局部水头损失
	float dFrictionHeadloss; // 摩擦水头损失
	float dQuality;// 水质
	char  szStatus[20]; // 状态
	char dDate[32];// 日期
	int dInterval; // 时段
};

#define NodeResultItems std::map<Str, NodeResultItem>
#define LinkResultItems std::map<Str, LinkResultItem>



#endif // !CIVTYPES_H



