#pragma once

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <Windows.h>
#include <qwerty\qwerty_common.h>
#include <shareCookie\browserType.h>
#include <winhttp.h>
#include "nlib_define.h"

#ifdef NLIB_EXPORTS


#define NLIB_DECLSPEC  __declspec(dllexport)

#else  //NLIB_EXPORTS

#ifdef NLIB_DYNAMIC
#define NLIB_DECLSPEC  __declspec(dllimport)
#else //NLIB_STATIC

#define NLIB_DECLSPEC extern

#endif



#endif //NLIB_EXPORTS

//型定義
//////////////////////////////////////////////////////////////////////////////////////////////////////




///
///nlibの戻り値の型
///
typedef UINT_PTR NLIB_RESULT;


///
///プロバイダタイプ
///
typedef UINT_PTR PROVIDERTYPE;


///
///NicoLiveStreamのコールバック関数のイベントタイプ型
///
typedef UINT_PTR		NICOLIVE_EVENT;

///
///NicoLiveStreamのコールバック関数のパラメータタイプ
///
typedef UINT_PTR		NICOLIVE_PARAM;


///
///NicoMyListのコールバック関数のイベントタイプ型
///
typedef UINT_PTR		NICOMYLIST_EVENT;




///
///ニコニコ生放送オブジェクトポインタ
///
typedef struct nicolivestream_t *NicoLiveStream_P;

///
///ニコニコ動画認証オブジェクト
///
typedef struct nicovideoauth_t *NicoVideoAuth_P;



///
///ニコニコ生放送ステータス
///
//typedef struct streamstatus_t *StreamStatus_P;


///
///ニコニコ生放送情報オブジェクト
///
//typedef struct streaminfo_t *StreamInfo_P;




///
///ニコニコ動画マイリストアイテムオブジェクト
///
typedef struct nicomylistitem_t *NicoMyListItem_P;

///
///ニコニコ動画マイリストアイテムデータオブジェクト
///
typedef struct nicoitemdata_t *NicoItemData_P;

///
///ニコニコ動画のマイリストオブジェクト
///
typedef struct nicomylist_t *NicoMyList_P;

///
///ニコニコ生放送イベントハンドラ
///
typedef NLIB_RESULT (*NicoRecvCallBack)(NICOLIVE_EVENT eventType,NicoLiveStream_P pNicoLiveStream,LPVOID option,NICOLIVE_PARAM param1,NICOLIVE_PARAM param2);

///
///ニコニコマイリストイベントハンドラ
///
typedef NLIB_RESULT (*NicoMyListCallBack)(LPVOID option,NicoMyListItem_P pVideo);

///
///ニコニコマイリスト一覧イベントハンドラ
///
typedef NLIB_RESULT (*NicoMyListGroupCallBack)(LPVOID option,NicoMyList_P pMyList);


///
///ニコニコ生放送チャットコメント構造体
///
typedef struct{
	LPCTSTR premium;
	LPCTSTR anonymity;
	LPCTSTR thread;
	LPCTSTR no;
	LPCTSTR vpos;
	LPCTSTR date;
	LPCTSTR locale;
	LPCTSTR user_id;
	LPCTSTR name;
	LPCTSTR chatBuf;
	LPTSTR* mail;
	UINT_PTR mailCount;
}NicoLiveChat,*NicoLiveChat_P;




///
///ニコニコ生放送スレッドコメント構造体
///
typedef struct{
	LPCTSTR thread;
	LPCTSTR ticket;
	LPCTSTR last_res;
	time_t server_time;
}NicoLiveThreadComment,*NicoLiveThreadComment_P;


///
///ニコニコ生放送送信結果コメント構造体
///
typedef struct{
	LPCTSTR status;
	LPCTSTR no;
	LPCTSTR thread;
}NicoLiveSendResultComment,*NicoLiveSendResultComment_P;


///
///ニコ生ハートビート構造体
///
typedef struct{

	NLIB_RESULT status;

	time_t time;

	UINT_PTR watchCount;

	UINT_PTR commentCount;

	LPCTSTR is_restrict;

	LPCTSTR ticket;


}NicoLiveHeartBeat,*NicoLiveHeartBeat_P;

namespace nlib{


///
///nlib例外処理クラス
///
class Exception:public std::exception{
		
private:
	std::wstring  wErrMessage;
	UINT_PTR line;
	std::wstring fileName;
	std::wstring function;

		
public:
	///
	///コンストラクタ
	///
	Exception();
	Exception(const char* const& errMessage);
	Exception(const wchar_t * const & errMessage,UINT_PTR in_line,LPCTSTR in_fileName,LPCTSTR in_function);
		
		
	///
	///エラー文言取得
	///
	LPCTSTR what();


	///
	///エラー発生行取得
	///
	UINT_PTR getLineNo();

	///
	///エラー発生ファイル名取得
	///
	LPCTSTR getFileName();


	///
	///エラー発生関数名を取得
	///
	LPCTSTR getFunctionName();

};
}


#ifdef __cplusplus
extern "C" {
#endif

	
	///
	///nlib初期化関数
	///
	NLIB_DECLSPEC NLIB_RESULT InitializeNLIB(HINTERNET hInternet);

	///
	///nlib後始末関数
	///
	NLIB_DECLSPEC VOID FinalizeNLIB();


	///
	///エラーメッセージ取得
	///
	NLIB_DECLSPEC LPCTSTR NLIB_GetErrorMessage(NLIB_RESULT rsltCode);






//
//ニコニコ生放送関連関数
////////////////////////////////////////////////////////////////////////////////////////////////////

	
	///
	///ニコニコ生放送オブジェクト動的生成
	///
	NLIB_DECLSPEC NicoLiveStream_P NicoLiveStream_new();

	///
	///動的に生成したニコニコ生放送オブジェクトを破棄
	///
	NLIB_DECLSPEC VOID NicoLiveStream_delete(NicoLiveStream_P* self);

	///
	///指定したURLの放送に接続
	///
	NLIB_DECLSPEC NLIB_RESULT NicoLiveStream_connect(NicoLiveStream_P self,NicoVideoAuth_P nicoVideoAuth,LPCTSTR url,NicoRecvCallBack callback,LPVOID option);
	

	///
	///放送との接続を切断する
	///
	NLIB_DECLSPEC VOID NicoLiveStream_disConnect(NicoLiveStream_P self);

	///
	///接続時の受信するコメント数を設定
	///
	NLIB_DECLSPEC VOID NicoLiveStrream_setResFrom(NicoLiveStream_P self,INT_PTR res);


	///
	///接続時の受信するコメント数を取得
	///
	NLIB_DECLSPEC INT_PTR NicoLiveStream_getResFrom(NicoLiveStream_P self);

	///
	///ハートビートの間隔を設定（ミリ秒)
	///
	NLIB_DECLSPEC VOID NicoLiveStream_setHeartBeatMsec(NicoLiveStream_P self,DWORD msec);


	///
	///ハートビートの間隔を取得(ミリ秒)
	///
	NLIB_DECLSPEC DWORD NicoLiveStream_getHeartBeatMsec(NicoLiveStream_P self);

	///
	///ハートビート有効・無効設定
	///
	NLIB_DECLSPEC VOID NicoLiveStream_setHeartBeatFlag(NicoLiveStream_P self,BOOL flag);


	///
	///ハートビート有効フラグ取得
	///
	NLIB_DECLSPEC BOOL NicoLiveStream_getHeartBeatFlag(NicoLiveStream_P self);

	///
	///キープアライブの間隔を設定(ミリ秒)
	///
	NLIB_DECLSPEC VOID NicoLiveStream_setKeapALiveMsec(NicoLiveStream_P self,DWORD msec);

	///
	///キープアライブの間隔を取得(ミリ秒)
	///
	NLIB_DECLSPEC DWORD NicoLiveStream_getKeapALiveMsec(NicoLiveStream_P self);


	///
	///キープアライブ有効・無効設定
	///
	NLIB_DECLSPEC VOID NicoLiveStream_setKeapALiveFlag(NicoLiveStream_P self,BOOL flag);


	///
	///キープアライブフラグ取得
	///
	NLIB_DECLSPEC BOOL NicoLiveStream_getKeapALiveFlag(NicoLiveStream_P self);


	///
	///生放送ステータス取得
	///
//	NLIB_DECLSPEC StreamStatus_P NicoLiveStream_getStreamStatus(NicoLiveStream_P self);

	///
	///コメント送信
	///
	NLIB_DECLSPEC NLIB_RESULT NicoLiveStream_sendChat(NicoLiveStream_P self,LPCTSTR chatbuf,LPCTSTR *mail,LPCTSTR *extends);


	///
	///生主コメント送信
	///
	NLIB_DECLSPEC NLIB_RESULT NicoLiveStream_sendOwnerChat(NicoLiveStream_P self,LPCTSTR chatbuf,LPCTSTR *mail,LPCTSTR *extends);

	///
	///ハートビート送信
	///
	NLIB_DECLSPEC NLIB_RESULT NicoLiveStream_sendHeartBeat(NicoLiveStream_P self);


	///
	///接続中の放送情報を問い合わせる
	///
//	NLIB_DECLSPEC StreamInfo_P NicoLiveStream_queryStreamInfo(NicoLiveStream_P self);


	///
	///ストリームステータスのIDを取得
	///
	NLIB_DECLSPEC LPCTSTR NicoLiveStream_getId(NicoLiveStream_P self);


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


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


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

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

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

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

	///
	///ストリームステータスのベース時刻を取得
	///
	NLIB_DECLSPEC time_t NicoLiveStream_getBaseTime(NicoLiveStream_P self);


	///
	///ストリームステータスのタイトル取得
	///
	NLIB_DECLSPEC LPCTSTR NicoLiveStream_getTitle(NicoLiveStream_P self);


	///
	///プレミアムフラグの取得
	///
	NLIB_DECLSPEC BOOL NicoLiveStream_isPremium(NicoLiveStream_P self);

	//
	//ニコニコ動画認証関連関数
	/////////////////////////////////////////////////////////////////////////////////////////////////
	
	///
	///ニコニコ動画認証オブジェクト生成
	///
	NLIB_DECLSPEC NicoVideoAuth_P NicoVideoAuth_new();

	///
	///ニコニコ動画認証オブジェクト破棄
	///
	NLIB_DECLSPEC VOID NicoVideoAuth_delete(NicoVideoAuth_P *self);


	///
	///ユーザーセッション取得
	///
	NLIB_DECLSPEC LPCTSTR NicoVideoAuth_getUserSession(NicoVideoAuth_P self);

	///
	///ニコニコ動画認証情報取得
	///
	NLIB_DECLSPEC NLIB_RESULT NicoVideoAuth_getNicoVideoAuth(NicoVideoAuth_P self,BROWSERTYPE browserType);


	//
	//ニコニコ動画マイリスト関連関数
	////////////////////////////////////////////////////////////////////////////////////////////////////

	///
	///とりあえずマイリスト一覧取得
	///
	NLIB_DECLSPEC NLIB_RESULT NicoMyList_getDefList(NicoVideoAuth_P pAuth,NicoMyListCallBack callback,LPVOID option);

	///
	///マイリスト取得
	///
	NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyList(NicoVideoAuth_P pAuth,LPCTSTR id,NicoMyListCallBack callback,LPVOID option);

	///
	///マイリストグループ取得
	///
	NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyListGroup(NicoVideoAuth_P pAuth,NicoMyListGroupCallBack callback,LPVOID option);


	///
	///マイリスト登録呼び出し
	/// 
	NLIB_DECLSPEC NLIB_RESULT NicoMyList_addItem(LPCTSTR video_id);






#ifdef __cplusplus
}
#endif



#pragma comment(lib,"Wininet.lib")
#pragma comment(lib,"WinHttp.lib")
#pragma comment(lib,"Iepmapi.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib, "shell32.lib" )
#pragma comment(lib,"expat.lib")
#pragma comment(lib,"sqlite3.lib")
#pragma comment(lib,"shareCookie.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"JSONParser.lib")
