#pragma once
#include "responsebase.h"
#include "SortArray.h"
#include "BinaryData.h"

/*!
	ディレクトリインデックス レスポンス
*/
class CDirectoryIndexResponse :
	public CResponseBase
{
public:
	CDirectoryIndexResponse(void);
	virtual ~CDirectoryIndexResponse(void);

	//!	レスポンス名取得(必ずstatic領域に宣言しなければならない)
	virtual LPCTSTR GetResponseName();

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス生成
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	レスポンス生成
	virtual void BuildResponse(IResponseContextPtr responseContext);

	//!	レスポンスヘッダ取得
	virtual void GetResponse(IResponseContextPtr responseContext, CContextResponseInfo responseInfo);

	//!	レスポンスボディ取得
	virtual int GetResponseBody(IResponseContextPtr responseContext, CBinaryData &body, int blockSize);

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	ファイルアイテムクラス
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	ソートモード
	enum
	{
		SORT_BY_NAME = 0,
		SORT_BY_DATE = 1,
		SORT_BY_SIZE = 2,
	};

	//!	ファイルアイテムクラス
	class CFileItem
	{
	public:
		//!	コンストラクタ
		CFileItem() { m_sortMode = 0; };

		//!	コンストラクタ
		CFileItem(CString name, CTime lastUpdate, __int64 size, int sortMode)
		{
			m_name = name;
			m_lastUpdate = lastUpdate;
			m_size = size;
			m_sortMode = sortMode;
		};

		//!	比較
		int operator > (CFileItem &other)
		{
			switch(m_sortMode)
			{
			case SORT_BY_DATE:
				return m_lastUpdate > other.m_lastUpdate;
			case SORT_BY_SIZE:
				return m_size > other.m_size;
			case SORT_BY_NAME:
			default:
				return m_name > other.m_name;
			}
		};

		//!	ファイル名
		CString		m_name;

		//!	最終更新日
		CTime		m_lastUpdate;

		//!	サイズ
		__int64		m_size;

		//!	ソートモード
		int			m_sortMode;
	};

	//!	配列型
	typedef CSortArray<CFileItem,CFileItem&>	CFileItemArray;

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	ファイルリストの取得
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	ファイルリスト生成
	void BuildFileList(IResponseContextTempPtr responseContext, CBinaryData &fileListHtml);

	//!	一行追加
	void AddListLine(CBinaryData &fileListHtml, CString name, CString path, CString iconPath, __int64 size = -1, CTime updateTime = 0);

	//!	HTMLロード
	CString LoadHtml(IResponseContextTempPtr responseContext);

	//!	リンクリストの取得
	void GetLinkList(IResponseContextTempPtr responseContext, CFileItemArray & list, int sortMode=-1);

	//!	ディレクトリリストの取得
	void GetDirectoryList(CFileItemArray &directoryList, CFileItemArray &fileList, CString targetDir, int showHiddenFile, int sortMode=-1);

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	レスポンスボディ
	CString	m_responseBody;
};


/*!
	ディレクトリインデックス レスポンスファクトリ
*/
class  CDirectoryIndexResponseFactory :
	public CResponseFactoryBase
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	自分のアイテムか？
	virtual int IsYourRequest(CContext context);

	//!	レスポンス取得
	virtual IResponsePtr GetResponse() { return IResponseRet(new CDirectoryIndexResponse, TRUE); };
};
