#pragma once

namespace nlite{

	///
	///ニコニコ動画認証オブジェクト
	///
	class CNicoVideoAuth{
		friend CNicoLiveStream;
	private:
		NicoVideoAuth_P nicoVideoAuth;			//内部データ


	public:
		///
		///コンストラクタ
		///
		CNicoVideoAuth();
		
		///
		///デストラクタ
		///
		~CNicoVideoAuth();

		///
		///ユーザセッションを取得
		///
		LPCTSTR GetUserSession();
		
		///
		///ブラウザタイプをセット
		///
		VOID SetBrowserType(BROWSERTYPE bt);


	private:
		///
		///内部データを取得
		///
		NicoVideoAuth_P GetAuth();


	};

	

	///
	///チャット書き込みデータ作成クラス
	///
	class CCommentMaker{
		friend CNicoLiveStream;							//フレンド宣言

	private:
		CNLiteString chatString;						//チャット本文
		std::deque<CNLiteString> mailsBuffer;			//mailコマンドデータ格納用バッファ
		std::deque<CNLiteString> exAttributeBuffer;		//拡張コマンド格納用バッファ
		std::vector<LPCTSTR> mails;						//mailコマンドリスト
		std::vector<LPCTSTR> exAttribute;				//拡張コマンドリスト

	public:


		///
		///チャット本文格納
		///
		BOOL SetChatString(LPCTSTR chatString);


		///
		///mailコマンド追加
		///
		BOOL AddMail(LPCTSTR mail);

		///
		///拡張コマンド追加
		///
		BOOL AddExAttribute(LPCTSTR name,LPCTSTR value);


	};

	///
	///ニコニコ生放送クラス
	///
	class CNicoLiveStream{

	private:
		NicoLiveStream_P self;			//内部データ

	public:
		
		///
		///コンストラクタ
		///
		CNicoLiveStream();
		
		///
		///デストラクタ
		///
		~CNicoLiveStream();
		

		///
		///接続時のコメント受信数を設定
		///
		VOID SetResFrom(INT_PTR res_from);


		///
		///現在設定してあるコメント受信数を取得
		///
		INT_PTR GetResFrom();

		///
		///ハートビート間隔をミリ秒単位で設定
		///
		VOID SetHeartBeatMsec(DWORD msec);

		///
		///ハートビート間隔をミリ秒単位で取得
		///
		DWORD GetHeartBeatMsec();

		///
		///ハートビートの有効無効設定
		///
		VOID SetHeartBeatFlag(BOOL flag);


		///
		///ハートビートが有効か調べる
		///
		BOOL GetHeartBeatFlag();

		///
		///キープアライブの間隔を設定
		///
		VOID SetKeapALiveMsec(DWORD msec);


		///
		///現在設定してあるキープアライブの間隔を取得
		///
		DWORD GetKeapALiveMsec();

		///
		///キープアライブ有効無効設定
		///
		VOID SetKeapAliveFlag(BOOL flag);

		///
		///キープアライブが有効か判定する
		///
		BOOL GetKeapAliveFlag();


		///
		///生放送に接続
		///
		NLIB_RESULT Connect(CNicoVideoAuth &nicoVideoAuth,LPCTSTR url,NicoRecvCallBack callback,LPVOID userData);

		
		///
		///放送切断
		///
		VOID DisConnect();

		///
		///チャット送信
		///
		NLIB_RESULT SendChat(CCommentMaker &commentMaker);


		///
		///生主チャット送信
		///
		NLIB_RESULT SendOwnerChat(CCommentMaker &commentMaker);

		///
		///ハートビート送信
		///
		NLIB_RESULT SendHeartBeat();


		///
		///ストリームステータスのIDを取得
		///
		LPCTSTR GetId();


		///
		///ストリームステータスのコミュニティ番号を取得
		///
		LPCTSTR GetDefaultCommunity();


		///
		///ストリームステータスのプロバイダタイプを取得
		///
		PROVIDERTYPE GetProviderType();


		///
		///ストリームステータスのオーナーフラグを取得
		///
		BOOL IsOwner();

		///
		///ストリームステータスの開始時刻を取得
		///
		time_t GetStartTime();

		///
		///ストリームステータスの終了時刻を取得
		///
		time_t GetEndTime();

		///
		///ストリームステータスの開場時刻を取得
		///
		time_t GetOpenTime();

		///
		///ストリームステータスのベース時刻を取得
		///
		time_t GetBaseTime();


		///
		///ストリームステータスのタイトル取得
		///
		LPCTSTR GetTitle();

		///
		///自分がプレミアムか判定
		///
		BOOL IsPremium();

	};


	



}