#pragma once
#include "IStringHelper.h"
#include "WorkspaceNodeWalker.h"
#include "WorkspaceKeyPairArray.h"
#include "SimpleArrayTemplate.h"
#include "WorkspaceString.h"

#define	NODE_NAME_LEN	128	//	ノード名標準バッファ
#define	NODE_GROW_SIZE	5	//	初期サイズ

//	宣言しておく
class CWorkspaceNode;

/*!
	ノード配列型の宣言
*/
class CWorkspaceNodeArray : public CSimpleArrayTemplate<CWorkspaceNode,
									CWorkspaceNode&,
									CSimpleArrayTemplateItmeConstructor<CWorkspaceNode>,
									NODE_GROW_SIZE>
{
};


/*!
	ワークスペースのノード保持クラス
*/
class CWorkspaceNode
{
public:
	CWorkspaceNode();
	CWorkspaceNode(LPCU8STR name);
	CWorkspaceNode(const CWorkspaceNode &othe);
	~CWorkspaceNode(void);

	/***********************************************************************************
		初期化など
	***********************************************************************************/
	//!	CArrayで利用するための、コピー演算子
	void operator=(const CWorkspaceNode &other);

	//!	全データクリア
	void Clear(void);

	//!	ノード名の設定
	void SetNodeName(LPCU8STR name) { m_nodeName = name; };

	//!	ノード名の取得
	LPCU8STR GetNodeName() const { return(m_nodeName); }; 


	/***********************************************************************************
		Keyに関する処理
	***********************************************************************************/
	//!	データの設定
	void SetKeyData(LPCU8STR key, LPCU8STR data,int noCase);

	//!	データの取得
	LPCU8STR GetKeyData(LPCU8STR key, LPCU8STR defaultData, int noCase);

	//!	データの削除
	void DeleteKey(LPCU8STR key);

	//!	キー数を取得
	int GetKeyCount();

	//!	全てのキー名を文字列として取得
	int GetAllKeyPair(IStringArrayPtr keys, IStringArrayPtr datas);


	//!	キーをまとめて設定
	void ClearAndSetKeys(CUTF8StringArray &keys, CUTF8StringArray &datas);

	/***********************************************************************************
		サブノードに関する処理
	***********************************************************************************/
	//!	サブノードを下層も含めて検索する(無ければ追加する)
	CWorkspaceNode *GetSubNode(CWorkspaceNodeWalker &path, CUTF8String &key);

	//!	ノードを削除する
	void DeleteNode(LPCU8STR name);

	//!	サブノード数を得る
	int GetSubNodeCount();

	//!	全てのサブノード名を文字列として取得
	int GetAllSubNode(IStringArrayPtr list);


	/***********************************************************************************
		入出力に関する処理
	***********************************************************************************/
	//!	サブノードを名前から取得・作成する
	CWorkspaceNode *GetSubNodeByName(LPCU8STR name, int errorIfExist = FALSE);

	//!	サブノードをインデックスで取得する
	CWorkspaceNode *GetSubNodeByIndex(int index);

	//!	キーをインデックスで取得する
	CWorkspaceKeyPair *GetKeyByIndex(int index);

protected:
	/***********************************************************************************
		Keyに関する処理
	***********************************************************************************/
	//!	Keyの検索
	int FindKeyIndex(LPCU8STR key,int noCase);

	/***********************************************************************************
		サブノードに関する処理
	***********************************************************************************/
	//!	サブノードを検索する
	int FindSubNodeIndex(LPCU8STR name);

protected:
	//!	このノードの持つデータ
	CWorkspaceKeyPairArray			m_keyData;

	//!	サブノート
	CWorkspaceNodeArray				m_subNode;

	//!	このノードの名前
	CWorkspaceString<NODE_NAME_LEN>	m_nodeName;
};

