#pragma once
#include "CivHydDataType.h"
#include "CivGraphList.h"
#include <vector>
#include <string>
#include <map>

#include "pandaAnalysis.h"

class  CivTrackingAnalysis
{
public:
	explicit CivTrackingAnalysis(const std::string& uri);
	~CivTrackingAnalysis();

	/**
	 *@brief 追踪节点上游路径
	 *@param sN 节点本点号
	 *@param jsonResult 追踪的结果json字符串
	 */
	bool upstreamTracking(const std::string& sN, std::string&jsonResult);

	/**
	 *@brief 追踪节点下游路径
	 *@param sN 节点本点号
	 *@param jsonResult 追踪的结果集字符串
	 */
	bool downstreamTracking(const std::string& sN, std::string& jsonResult);

	/**
	 *@brief 计算管网中某个水源所能供水的范围
	 *@param sN 水源的编号
	 *@param jsonResult 结果字符串
	 */
	bool waterSupplyScopeAnalysis(const std::string& sN, std::string& jsonResult);

	/**
	 *@brief 根据数据库管网构建管网有向图
	 *@param uri 数据库连接地址
	 */
	bool createGraphFrom();
private:
	

	/**
	*@brief 节点和管段集合信息转换成json字符串
	*@param junctions 节点信息集合
	*@param pipes 管段信息集合
	*@param jsonResult 输出的结果字符串
	*/
	bool transformJson(const std::vector<CivGraphJunction>& junctions,
		const std::vector<CivGraphEdage>& pipes, std::string& jsonResult);

	/**
	*@brief 追踪节点上游路径
	*@param sN 节点本点号
	*@param junctions 追踪到的节点集合
	*@param pipes 追踪到的管段集合
	*/
	bool upstreamTracking(const std::string& sN,
		std::vector<CivGraphJunction>& junctions,
		std::vector<CivGraphEdage>& pipes);

	/**
	*@brief 追踪节点下游路径
	*@param sN 节点本点号
	*@param junctions 追踪到的节点集合
	*@param pipes 追踪到的管段集合
	*/
	bool downstreamTracking(const std::string& sN,
		std::vector<CivGraphJunction>& junctions, 
		std::vector<CivGraphEdage>& pipes);

	/**
	*@brief 计算管网中某个水源所能供水的范围
	*@param sN 水源的编号
	*@param junctions 可以供水的节点
	*@param pipes 可以供水的管段
	*/
	bool waterSupplyScopeAnalysis(const std::string& sN,
		std::vector<CivGraphJunction>& junctions,
		std::vector<CivGraphEdage>& pipes);

private:
	std::string mUri;
	std::map<std::string, std::string> mSnToCodeMap;
	ALGraph<CivGraphJunction, CivGraphEdage>* mGraph; // 管网有向图
};
