#pragma once

namespace nlite{

	template <typename T>
	struct CommentInfo{
		LPCTSTR name;
		T userData;
	};

	typedef CommentInfo<COLORREF> CommentColorInfo;
	typedef CommentInfo<LPCTSTR> CommentSizeInfo; 
	typedef CommentInfo<LPCTSTR> CommentPosInfo;

	class CNicoLiveStream;

	///
	///一般会員コマンド
	///
	namespace generalUser{
		///
		///一般会員コメント色リスト
		///
		extern const  CommentColorInfo COMMENT_COLORLIST[];

		///
		///一般会員サイズコマンドリスト
		///
		extern const CommentSizeInfo COMMENT_SIZELIST[];

		///
		///一般会員コメント位置リスト
		///
		extern const CommentPosInfo COMMENT_POSLIST[];

	}

	///
	///プレミアム会員コマンド
	///
	namespace premiumUser{
		///
		///プレミアム会員コメント色リスト
		///
		extern const CommentColorInfo COMMENT_COLORLIST[];


		///
		///プレミアム会員サイズコマンドリスト
		///
		extern const CommentSizeInfo COMMENT_SIZELIST[];

		///
		///プレミアム会員コメント位置リスト
		///
		extern const CommentPosInfo COMMENT_POSLIST[];

	}


	class CCommentWriteWindow;
	class CSubChatEdit:public CWindowImpl<CSubChatEdit,CEdit>{
		friend CCommentWriteWindow;


	private:
		CCommentWriteWindow &self;
		CComAutoCriticalSection cs;
		BOOL untilConnectingFlag;

	public:
		CSubChatEdit(CCommentWriteWindow &in_commentWriteWindow):self(in_commentWriteWindow){}


		BEGIN_MSG_MAP_EX(CSubLiveNoComboBox)
			MSG_WM_KEYDOWN(OnKeyDown)
		END_MSG_MAP()

			void OnKeyDown(TCHAR wParam, UINT upLParam,UINT loLParam);


			VOID AgreeEnter();

			static VOID EnterChatBox(LPVOID userData);
	};


	const static LPCTSTR COMMENTWRITEWINDOW = TEXT("commentWriteWindow");


	///
	///コメント書き込み用ウィンドウクラス
	///
	class CCommentWriteWindow:public CWindowImpl<CCommentWriteWindow>{

		friend CSubChatEdit;
	private:
		CComboBox commentPosBox;								//コメント位置選択コンボボックス
		CComAutoCriticalSection commentPosBoxCS;				//コメント位置選択コンボボックスクリティカルセクション
		CComboBox commentSizeBox;								//コメントの大きさ選択コンボボックス
		CComAutoCriticalSection commentSizeBoxCS;				//コメントの大きさ選択コンボボックスクリティカルセクション
		CComboBox commentColorBox;								//コメント色選択コンボボックス
		CButton anonymousButton;								//184選択ボタン
		CButton ownerModeButton;								//主コメ選択ボタン
		CSubChatEdit commentSubEdit;							//コメント書き込み用エディットサブクラス
		CButton commentWriteButton;								//コメント書き込みボタン
		UINT_PTR commentWriteMaxLength;							//コメント書き込み長最大値
		UINT_PTR commentWriteHeight;							//コメント書き込みコントロール配置領域の高さ
		UINT_PTR infoDispHeight;								//コメント書き込みに関するもの以外の情報表示領域の高さ
		UINT_PTR commentWriteInternalHeight;					//コメント書き込みコントロール配置領域の高さ(内部)
		CNicoLiveStream &nicoLiveStream;						//放送オブジェクトの参照
		time_t streamTime;										//放送経過時間
		CFont checkButtonFont;									//184表示用フォント
		CFont timeFont;											//経過時間表示用フォント
		COLORREF editBkColor;									//エディットの背景色
		CBrush editBkBrush;										//エディットの背景ブラシ
		

		//コントロールID
		enum CONTROLID{
			COMMENTPOS_BOX = 1,
			COMMENTSIZE_BOX = 2,
			COMMENTCOLOR_BOX = 3,
			ANONYMOUS_BUTTON = 4,
			COMMENT_EDIT = 5,
			COMMENTWRITE_BOTTON = 6,
			TIMER_ID = 7,
			OWNERMODE_BUTTON = 5
		};
		


	public:

		DECLARE_WND_CLASS(COMMENTWRITEWINDOW)
		//メッセージマップ
		BEGIN_MSG_MAP(CCommentWriteWindow)
			MSG_WM_CREATE(OnCreate)
			MSG_WM_DESTROY(OnDestroy)
			MSG_WM_PAINT(OnPaint)
			MSG_WM_SIZE(OnSize)
			MSG_WM_ERASEBKGND(OnEraseBkGnd)
			MSG_WM_CTLCOLOREDIT(OnCtlolorEdit)
			MSG_WM_DRAWITEM(OnDrawItem)
			MSG_WM_MEASUREITEM(OnMeasureItem)
			MSG_WM_TIMER(OnTimer)
			COMMAND_CODE_HANDLER_EX(BN_CLICKED,OnButton)
		END_MSG_MAP()




		public:

		///
		///コンストラクタ
		///
		CCommentWriteWindow(CNicoLiveStream &nicoLiveStream);

		///
		///現在書き込み処理中かのフラグ確認
		///
		BOOL IsWrighthing();


		///
		///このウィンドウの高さを取得
		///
		UINT_PTR GetHeight();

		///
		///コメント送信
		///
		BOOL SendChat();

		///
		///コメント送信欄に文字列を設定
		///
		BOOL SetText(LPCTSTR lpStr);

		///
		///コメント受信開始時の処理
		///
		VOID OnChatReceveStart(CNicoLiveStream &nicoLiveStream,NicoLiveThreadComment_P threadComment);

		///
		///コメント送信結果受信時の処理
		///
		VOID OnSendChatResult();

		///
		///ハートビート送信時の処理
		///
		VOID OnHeartBeat(NicoLiveHeartBeat_P heartBeat);

		///
		///放送切断時の処理
		///
		VOID OnDisConnect();

		//
		//メッセージハンドラ
		//
	private:

		///
		///ウィンドウ作成時の処理
		///
		LRESULT OnCreate(LPCREATESTRUCT lpReateStruct);


		///
		///ウィンドウ破棄時の処理
		///
		VOID OnDestroy();

		///
		///描画時の処理
		///
		VOID OnPaint(HDC hdc);


		///
		///サイズ変更時の処理
		///
		LRESULT OnSize(UINT wParam,SIZE lParam);

		///
		///サイズ変更処理
		///
		VOID ChangeSize(SIZE &size);


		///
		///アイテム描画処理
		///
		VOID OnDrawItem(UINT wParam,LPDRAWITEMSTRUCT lParam);

		///
		///アイテムの高さ変更処理
		///
		VOID OnMeasureItem(UINT wParam,LPMEASUREITEMSTRUCT lParam);

		///
		///背景のチラツキを抑える
		///
		LRESULT OnEraseBkGnd(HDC wParam);

		///
		///ボタン押下時の処理
		///
		LRESULT OnButton(UINT hiWparam,INT_PTR loWparam,HWND lParam);


		///
		///エディットコントロールカスタムドロー
		///
		LRESULT OnCtlolorEdit(HDC hdc,HWND hWnd);

		VOID OnTimer(UINT id);


	};

}