/* ==========================================================================
* 파    일 : ChatManager.h
* 목    적 : 채팅 매니져
* 작 성 자 : 김가람
* 작 성 일 : 2006-11-20
* 주의사항 :
*===========================================================================*/
#pragma once

class cChatCommands;
class cUIWindow;
class cUINode;
struct sInventory;

enum eChatMsgKind
{
	eCHAT_NORMAL,
	eCHAT_PARTY,
	eCHAT_GUILD,
	eCHAT_SHOUT,
	eCHAT_TRADE,
	eCHAT_WHISPER,
	eCHAT_SYSTEM,
	eCHAT_NOTICE,
	eCHAT_GM,

	eCHAT_MAX,
};

enum eSystemMsgKind
{
	eSYSTEM_NORMAL,		/// 일반적인 시스템 메시지(레벨업, 경험치 획득, 스킬 사용 등)
	eSYSTEM_GETMONEY,	/// 돈 획득
	eSYSTEM_GETITEM,	/// 일반 아이템 획득(단 아이템이름 색상은 레어도 색상값 사용)
	eSYSTEM_QUEST,		/// 퀘스트 관련 메시지(퀘스트 시작 종료, 퀘스트 아이템 획득)
	eSYSTEM_DOITEM,		/// 조합, 분해, 인챈트, 카드 장착시 알림 메시지
	eSYSTEM_CASH,		/// 캐쉬 아이템 사용 및 기간 만료 시 알림 메시지
	eSYSTEM_NPCSTORE,	/// NPC 상점 판매/구입시
	eSYSTEM_PVP,		/// PVP 알림
	eSYSTEM_GM,         /// GM 에게 특정 조치를 당했을 때 알림 메시지
};

class cChatManager
{
	static cChatManager* mInstance;

public:
	/// 단일 객체를 리턴 
	static cChatManager* Get();

public:
	cChatManager();
	~cChatManager();

	/// 초기화
	bool Init();
	void Clear();

	/// 메시지 파서
	void NetworkMsgParser( char* pMsg );

	/// 포커스를 가지는 에디트 추가 ( 포커스관리 )
	void AddFocusNode( cUINode* n );

	/// 시스템 메세지 출력
	void AddSystemMsg( eSystemMsgKind kind, LPCTSTR chatmsg );

	/// 팁 메세지 출력
	void AddTipMsg( LPCTSTR msg );

	/// 아이템 획득 메세지 출력
	void AddItemMsg( unsigned long itemIndex, unsigned int slotIndex, LPCTSTR msg1, LPCTSTR msg2, bool IsQuest = false );
	void AddItemMsg( sInventory inventory, LPCTSTR name, LPCTSTR msg, eChatMsgKind msgkind );

	/// 채팅 메시지 보내기 ( 채팅창 -> 서버 )
	void SendChatMsg( eChatMsgKind type, LPCTSTR msg );

	/// 각 윈도우 저장
	void SetChatWindow( cUIWindow* w );
	void SetMtoMChatWindow( cUIWindow* w );
	void SetNoteWindow( cUIWindow* w );
	void SetFriendWindow( cUIWindow* w );

	/// 채팅창 포커스 바꾸기 ( shift + tab : 채팅창 <-> 1:1대화창 )
	void ChangeFocus();

	/// 감정표현 관련데이터 삽입
	bool AddCommunityData( LPCTSTR key, unsigned long index );

	/// 채팅창에 보내기 ( 서버 -> 채팅창 )
	void AddChatMsg( LPCTSTR chatmsg, unsigned int msgkind = 0 );

	/// 공지내용 보내기
	void AddNoticeMsg( LPCTSTR msg, unsigned long color );
	
private:
	void DeleteNote();

private:
	/// 채팅창 ( 기본 + 분리창 3개 )
	typedef tPointerList<void*> cChatWindowList;
	cChatWindowList		mChatWindowList;
	
	/// 일대일대화창 ( 3개 )
	typedef tPointerList<void*>	cMtoMChatList;
	cMtoMChatList	mMtoMChatList;

	/// 각창 포커스관리 ( 채팅창, 일대일대화창만 등록 )
	typedef tPointerArray<void*> cFocusArr;
	cFocusArr	mFocusArr;

	/// 쪽지 관리(sNoteList)
	typedef tPointerList<void*> cNoteList;
	cNoteList	mNoteList;

	/// 쪽지 윈도우
	cUIWindow*		mpNoteWindow;

	/// 친구 윈도우
	cUIWindow*		mpFriendWindow;

	///
	cChatCommands*	mpCommands;
};

inline cChatManager* cChatManager::Get()
{
	return mInstance;
}

#define CHATMANAGER cChatManager::Get()
