/*! \file
* \brief StovePCMatchmakingDefine 헤더파일
* \details StovePCMatchmaking 사용하는 enum를 선언합니다.
*/
#ifndef STOVEPCMATCHMAKINGDEFINE_H_
#define STOVEPCMATCHMAKINGDEFINE_H_

/*! \defgroup StovePCMatchmakingResult StovePCMatchmakingResult
* \brief API 호출 및 매치메이킹 서버에서 주는 응답값입니다.
*/

/*! \ingroup StovePCMatchmakingResult
* \brief 응답 값 정의 enum
*/
enum StovePCMatchmakingResult
{
	/// 정상
	STOVE_PC_MATCHMAKING_NO_ERROR = 0,

	/// 로비에서 KICK 되었습니다. 
	STOVE_PC_MATCHMAKING_USER_KICKED = 5000,

	/// 로비에서 BAN 되었습니다. 
	STOVE_PC_MATCHMAKING_USER_BANNED = 5001,

	/// 로비가 삭제되었습니다. 
	STOVE_PC_MATCHMAKING_USER_ROOM_DESTROYED = 5002,

	/// 맴버 전용 로비로 변경되어 로비에서 KICK 되었습니다.
	STOVE_PC_MATCHMAKING_USER_MEMBERSHIP_REQUIRED = 5003,

	/// 서버에서 로비가 제거되었습니다. 
	STOVE_PC_MATCHMAKING_USER_ROOM_SHUTDOWN = 5004,

	/// 맴버 전용 로비에서 등급이 변경되어 KICK 되었습니다.
	STOVE_PC_MATCHMAKING_USER_AFFILIATION_CHANGED = 5005,

	/// 유저가 비정상 종료로 로비에서 나갔습니다.
	STOVE_PC_MATCHMAKING_USER_ABNORMALTERMINATION = 5006,

	/// 운영이슈로 서버에서 로비가 삭제되었습니다. 
	STOVE_PC_MATCHMAKING_ROOM_DELETED_AS_OPERATIONAL = 5007,

	/// 권한이 변경되지 않았습니다.	
	STOVE_PC_MATCHMAKING_AFFILIATION_NOT_CHANGED = 5100,

	/// 더 이상 지원하지 않는 함수이며, 상위 버전에서 제거될 수 있습니다.
	STOVE_PC_MATCHMAKING_WARNING_DEPRECATED_FUNC = 10000,

	/// 이미 라이브러리가 초기화 되었습니다.
	STOVE_PC_MATCHMAKING_ALREADY_INIT = 10001,

	/// 아직 라이브러리가 초기화 되지 않았습니다.	
	STOVE_PC_MATCHMAKING_NOT_YET_INIT = 10002,

	/// CALLBACK 함수가 설정되지 않았습니다.
	STOVE_PC_MATCHMAKING_CALLBACK_EMPTY = 10003,

	/// CALLBACK 함수가 잘 못 되었습니다.
	STOVE_PC_MATCHMAKING_CALLBACK_INVALID = 10004,

	/// 아직 접속하지 않았습니다.
	STOVE_PC_MATCHMAKING_NOT_YET_CONNECTED = 10101,

	/// 이미 접속 중입니다.
	STOVE_PC_MATCHMAKING_ALREADY_CONNECTED = 10102,

	/// HOST 이름이 잘못되었습니다. 
	STOVE_PC_MATCHMAKING_HOST_EMPTY = 10103,

	/// PORT번호가 잘못되었습니다. 
	STOVE_PC_MATCHMAKING_INVALID_PORT = 10104,

	/// 접속 정보가 잘 못 되었습니다. 
	STOVE_PC_MATCHMAKING_INVALID_CONNECTION_INFO = 10105,

	/// 알려진 호스트가 없습니다. 
	STOVE_PC_MATCHMAKING_HOST_NOT_FOUND = 10106,

	/// 서버 접속 허용 시간(10초)을 초과했습니다. 	
	STOVE_PC_MATCHMAKING_CONNECT_TIMEOUT = 10107,

	/// 접속서버 정보가 잘못되었거나 연결이 거부되었습니다. 
	STOVE_PC_MATCHMAKING_CONNECTION_FAIL = 10108,

	/// PASSWORD가 비어 있습니다. 
	STOVE_PC_MATCHMAKING_USER_PASSWORD_EMPTY = 10109,

	/// JID 비어 있습니다. 
	STOVE_PC_MATCHMAKING_JID_EMPTY = 10110,

	/// JID 형식이 잘 못 되었습니다.
	STOVE_PC_MATCHMAKING_JID_INVALID = 10111,

	/// ACCESSTOKEN 검증이 실패했습니다.
	STOVE_PC_MATCHMAKING_ACCESS_TOKEN_VERIFYFAIL = 10112,

	/// 접속서버 정보가 잘못되었거나 연결이 거부되었습니다.
	STOVE_PC_MATCHMAKING_CONNECTION_REFUSED = 10113,

	/// DOMAIN 이름이 잘못되었습니다.	
	STOVE_PC_MATCHMAKING_INVALID_DOMAIN = 10114,

	/// 라이브러리와 서버의 버전 정보가 맞지 않습니다. 라이브러리 업데이트가 필요합니다.	
	STOVE_PC_MATCHMAKING_WRONG_VERSION = 10115,

	/// JID 리소스가 비어 있습니다. 
	STOVE_PC_MATCHMAKING_RESOURCE_EMPTY = 10116,

	/// 이미 접속종료 중입니다.
	STOVE_PC_MATCHMAKING_ALREADY_DISCONNECTED = 10401,

	/// 아직 접속종료되지 않았습니다.	
	STOVE_PC_MATCHMAKING_NOT_YET_DISCONNECT = 10402,

	/// 로비 JID 형식이 잘 못 되었습니다.
	STOVE_PC_MATCHMAKING_LOBBY_JID_INVALID = 10501,

	/// THIS FUNCTION IS CALLED WHEN AN ERROR OCCURS IN THE ROOM OR WHEN ENTERING THE ROOM.
	STOVE_PC_MATCHMAKING_MUC = 10502,

	/// 이미 접속중인 MUC LOBBY입니다.
	STOVE_PC_MATCHMAKING_ALREADY_JOIN = 10503,

	/// 이미 생성된 MUC LOBBY입니다.
	STOVE_PC_MATCHMAKING_ALREADY_CREATE = 10504,

	/// 접속중인 LOBBY이 아닙니다.
	STOVE_PC_MATCHMAKING_NOT_IN_THE_LOBBY = 10505,

	/// 로비 이름이 비어 있습니다. 
	STOVE_PC_MATCHMAKING_LOBBY_NAME_EMPTY = 10506,

	/// 로비 참여 인원 수가 MAX에 도달하여 참여할 수 없습니다. 
	STOVE_PC_MATCHMAKING_LOBBY_FULL = 10507,

	/// 로비에 동일한 닉네임을 가진 사용자가 있어서 참여할 수 없습니다. 
	STOVE_PC_MATCHMAKING_CONFLICT = 10508,

	/// 그외 MUC 에러  
	STOVE_PC_MATCHMAKING_HAS_NO_RIGHT = 10509,

	/// 로비가 존재하지 않습니다. 
	STOVE_PC_MATCHMAKING_ITEM_NOT_FOUND = 10510,

	/// 로비에 접근이 차단된 유저입니다. 
	STOVE_PC_MATCHMAKING_FORBIDDEN = 10511,

	/// 요청한 로비 이름은 사용할 수 없습니다  
	STOVE_PC_MATCHMAKING_NOT_ACCEPTABLE = 10512,

	/// 로비 생성이 제한되었습니다  
	STOVE_PC_MATCHMAKING_NOT_ALLOWED = 10513,

	/// 로비에 접근 가능한 맴버가 아닙니다  
	STOVE_PC_MATCHMAKING_REGISTRATION_REQUIRED = 10514,

	/// 로비 암호가 맞지 않습니다  	 
	STOVE_PC_MATCHMAKING_NOT_AUTHORIZED = 10515,

	/// 권한이 없습니다.
	STOVE_PC_MATCHMAKING_INVALID_PERMISSION = 10516,

	/// 로비에서 해당 유저를 찾을 수 없습니다.
	STOVE_PC_MATCHMAKING_LOBBY_USER_NOT_FOUND = 10517,

	/// 잘못된 요청입니다.	
	STOVE_PC_MATCHMAKING_LOBBY_BAD_REQUEST = 10518,

	/// 서버 작업을 요청중입니다. 잠시후에 다시 시도하세요.
	STOVE_PC_MATCHMAKING_SERVER_BUSY = 10519,

	/// 메시지 송신 권한이 제한되었습니다  
	STOVE_PC_MATCHMAKING_NOT_ALLOWED_SEND_MSG = 10520,

	/// 접속할 수 있는 로비 허용치를 초과하였습니다.
	STOVE_PC_MATCHMAKING_MAX_JOIN_LOBBY = 10521,

	/// 단위 시간당 송신할 수 있는 메시지 허용치를 초과하였습니다.
	STOVE_PC_MATCHMAKING_TRAFFIC_LIMIT_EXCEEDED = 10522,

	/// 로비 PRESENCE 에러
	STOVE_PC_MATCHMAKING_PRESENCE = 10523,

	/// 참여가 제한된 로비입니다.
	STOVE_PC_MATCHMAKING_LOBBY_NOT_ACCEPTABLE = 10524,

	/// XMPP 확장 X태그의 메시지 타입이 잘못되었습니다.
	STOVE_PC_MATCHMAKING_INVALID_MESSAGE_TYPE = 10601,

	/// SESSION이 존재하지 않습니다. 
	STOVE_PC_MATCHMAKING_SESSION_NOT_ESTABLISHED = 10602,

	/// 잘못된 메시지가 수신되었습니다.(빈메시지)
	STOVE_PC_MATCHMAKING_MESSAGE_BODY_EMPTY = 10603,

	/// 잘못된 메시지가 수신되었습니다.(파싱할 수 없는 메시지)
	STOVE_PC_MATCHMAKING_MESSAGE_PARSE = 10604,

	/// 송신 메시지의 파라미터값이 비어 있습니다.
	STOVE_PC_MATCHMAKING_MESSAGE_PARAMETER_EMPTY = 10605,

	/// 메시지가 송신할 수 있는 최대 문자열 길이를 초과하였습니다.
	STOVE_PC_MATCHMAKING_MESSAGE_MAX_LENGTH = 10606,

	/// 나에게 메시지를 송신할 수 없습니다.
	STOVE_PC_MATCHMAKING_NOT_SEND_SELF_MESSAGE = 10607,

	/// 메시지 송신자가 수신로비에 존재하지 않습니다.
	STOVE_PC_MATCHMAKING_MESSENGER_MUC_SEND_NOT_FOUND = 10608,

	/// 로비에 자신을 초대할 수 없습니다.
	STOVE_PC_MATCHMAKING_LOBBY_INVITE_ONE_SELF = 13001,

	/// 초대자를 찾을 수 없습니다.
	STOVE_PC_MATCHMAKING_INVITER_NOT_FOUND = 13002,

	/// 피초대자를 찾을 수 없습니다.
	STOVE_PC_MATCHMAKING_INVITEE_NOT_FOUND = 13003,

	/// 로비초대에서 알 수 없는 에러가 반환되었습니다.
	STOVE_PC_MATCHMAKING_LOBBY_INVITE_UNKNOWN = 13004,

	/// 피초대자는 이미 로비에 접속중입니다.
	STOVE_PC_MATCHMAKING_INVITEE_ALREADY_JOIN = 13005,

	/// API에 대한 호출이 네트워크 지연, 서버 작업지연등으로 타임아웃이 발생하였습니다.	
	STOVE_PC_MATCHMAKING_API_TIMEOUT = 15001,

	/// META DATA 에러
	STOVE_PC_MATCHMAKING_METADATA = 16001,

	/// META DATA API 파라미터값이 비어 있습니다.
	STOVE_PC_MATCHMAKING_METADATA_PARAMETEREMPTY = 16002,

	/// META DATA 값의 타입이 유효하지 않습니다.
	STOVE_PC_MATCHMAKING_METADATA_INVALID_TYPE = 16003,

	/// META DATA 값 설정이 유효하지 않습니다. 에러 이유를 확인하세요.	
	STOVE_PC_MATCHMAKING_SET_METADATA_REASON = 16004,

	/// 친구 에러	
	STOVE_PC_MATCHMAKING_FRIENDS_ERROR = 17001,

	/// 유저 차단 에러	
	STOVE_PC_MATCHMAKING_BLOCK_USER_ERROR = 18001,
};

/*! \ingroup StovePCMatchmakingResult
* \brief 접속 종료 응답값
*/
enum StovePCMatchmakingDisconnectCode
{
	/// 클라이언트에서 API를 호출하여 접속 종료되었습니다.
	STOVE_PC_MATCHMAKING_DISCONNECT_CLIENT = 10,

	/// 서버로부터 접속 종료되었습니다.
	STOVE_PC_MATCHMAKING_DISCONNECT_SERVER = 11,

	/// 타임아웃, 혹은 프로토콜 에러 등 host machine에 의해 접속 종료되었습니다.
	STOVE_PC_MATCHMAKING_DISCONNECT_BY_HOST = 12,

	/// 중복접속으로 인해 접속 종료되었습니다.
	STOVE_PC_MATCHMAKING_DISCONNECT_CONFLICT = 13,
};	

/*! \defgroup Enumeration Enumeration
* \brief 매치메이킹 SDK에 정의된 Enumeration 입니다.
*/

/*! \ingroup Enumeration
* \brief 매치메이킹 서버 접속 상태
*/
enum StovePCMatchmakingConnectionState
{
	/// 연결되지 않음	
	STOVE_PC_MATCHMAKING_NOT_CONNECTED = 0,

	/// 연결중
	STOVE_PC_MATCHMAKING_CONNECTING = 1,

	/// 연결됨	
	STOVE_PC_MATCHMAKING_CONNECTED = 2,
};

/*! \ingroup Enumeration
* \brief 로비 참가원의 등급 정보
*/
enum StovePCMatchmakingAffiliation
{
	/// 등급 없음
	STOVE_PC_MATCHMAKING_AFFILIATION_NONE = 0,

	/// 로비 접속 제한 유저
	STOVE_PC_MATCHMAKING_AFFILIATION_BANNED = 1,

	/// 로비 맴버
	STOVE_PC_MATCHMAKING_AFFILIATION_MEMBER = 2,

	/// 로비 관리자
	STOVE_PC_MATCHMAKING_AFFILIATION_ADMINISTRATOR = 3,

	/// 로비 소유자
	STOVE_PC_MATCHMAKING_AFFILIATION_OWNER = 4,
};

/*! \ingroup Enumeration
* \brief 로비 검색 비교 연산자 타입
*/
enum StovePCMatchmakingComparisonType
{
	/// 같다( = )
	STOVE_PC_MATCHMAKING_EQUAL = 0,

	/// 같지 않다( != )
	STOVE_PC_MATCHMAKING_NOT_EQUAL = 1,

	/// 크다( > )
	STOVE_PC_MATCHMAKING_GREATER_THAN = 2,

	/// 크거나 같다( => )
	STOVE_PC_MATCHMAKING_EQUAL_TO_OR_GREATER_THAN = 3,

	/// 작다( < )
	STOVE_PC_MATCHMAKING_LESS_THAN = 4,

	/// 작거나 같다( <= )
	STOVE_PC_MATCHMAKING_EQUAL_TO_OR_LESS_THAN = 5,
};

/*! \ingroup Enumeration
* \brief 유저 상태 정보
*/
enum StovePCMatchmakingUserStatus
{
	/// 오프라인
	STOVE_PC_MATCHMAKING_UNAVAILABLE = 0,

	/// 온라인	
	STOVE_PC_MATCHMAKING_AVAILABLE = 1,
};

/*! \ingroup Enumeration
* \brief 로그 레벨
*/
enum StovePCMatchmakingLogLevel
{
	/// Trace Level
	STOVE_PC_MATCHMAKING_TRACE = 1,					

	/// Debug Level
	STOVE_PC_MATCHMAKING_DEBUG = 2,					

	/// Info Level
	STOVE_PC_MATCHMAKING_INFO = 3,					

	/// Warn Level
	STOVE_PC_MATCHMAKING_WARN = 4,					

	/// Error Level
	STOVE_PC_MATCHMAKING_ERROR = 5,					

	/// 로깅 없음
	STOVE_PC_MATCHMAKING_NONE = 10000,				
};

/*! \ingroup Enumeration
* \brief API 번호
*/
enum StovePCMatchmakingFunctionType
{
	/// StovePCMatchmaking_Init 함수
	STOVE_PC_MATCHMAKING_INIT = 0,

	/// StovePCMatchmaking_UnInit 함수
	STOVE_PC_MATCHMAKING_UNINIT = 1,

	/// StovePCMatchmaking_Connect	함수
	STOVE_PC_MATCHMAKING_CONNECT = 2,

	/// StovePCMatchmaking_Disconnect 함수
	STOVE_PC_MATCHMAKING_DISCONNECT = 3,

	/// StovePCMatchmaking_SendLobbyMsg 함수
	STOVE_PC_MATCHMAKING_SEND_LOBBY_MSG = 6,

	/// StovePCMatchmaking_SendLobbyBinarydata 함수
	STOVE_PC_MATCHMAKING_SEND_LOBBY_BINARYDATA = 7,

	/// StovePCMatchmaking_CreateLobby 함수
	STOVE_PC_MATCHMAKING_CREATE_LOBBY = 8,

	/// StovePCMatchmaking_DestroyLobby 함수
	STOVE_PC_MATCHMAKING_DESTROY_LOBBY = 9,

	/// StovePCMatchmaking_JoinLobby 함수
	STOVE_PC_MATCHMAKING_JOIN_LOBBY = 10,

	/// StovePCMatchmaking_LeaveLobby 함수
	STOVE_PC_MATCHMAKING_LEAVE_LOBBY = 11,

	/// StovePCMatchmaking_SendLobbyInvitation 함수
	STOVE_PC_MATCHMAKING_SEND_LOBBY_INVITATION = 12,

	/// StovePCMatchmaking_SendRejectLobbyInvitation 함수
	STOVE_PC_MATCHMAKING_SEND_REJECT_LOBBY_INVITATION = 13,

	/// StovePCMatchmaking_GetLobbyUserList 함수
	STOVE_PC_MATCHMAKING_GET_LOBBY_USER_LIST = 14,

	/// StovePCMatchmaking_GetBanUserList 함수
	STOVE_PC_MATCHMAKING_GET_BAN_USER_LIST = 15,

	/// StovePCMatchmaking_GetMyLobbyList 함수
	STOVE_PC_MATCHMAKING_GET_MY_LOBBY_LIST = 16,

	/// StovePCMatchmaking_GetLobbyList 함수
	STOVE_PC_MATCHMAKING_GET_LOBBY_LIST = 17,

	/// StovePCMatchmaking_KickUser 함수
	STOVE_PC_MATCHMAKING_KICK_USER = 18,

	/// StovePCMatchmaking_BanUser 함수
	STOVE_PC_MATCHMAKING_BAN_USER = 19,

	/// StovePCMatchmaking_UnBanUser 함수
	STOVE_PC_MATCHMAKING_UNBAN_USER = 20,

	/// StovePCMatchmaking_JoinRandomLobby 함수
	STOVE_PC_MATCHMAKING_JOIN_RANDOM_LOBBY = 21,

	/// StovePCMatchmaking_RequestLobbyList 함수
	STOVE_PC_MATCHMAKING_REQUEST_LOBBY_LIST = 22,

	/// StovePCMatchmaking_SetLobbyData 함수
	STOVE_PC_MATCHMAKING_SET_LOBBY_DATA = 23,

	/// StovePCMatchmaking_GetLobbyData 함수
	STOVE_PC_MATCHMAKING_GET_LOBBY_DATA = 24,

	/// StovePCMatchmaking_SetLobbyUserData 함수
	STOVE_PC_MATCHMAKING_SET_LOBBY_USER_DATA = 25,

	/// StovePCMatchmaking_SetLobbyOwner 함수
	STOVE_PC_MATCHMAKING_SET_LOBBY_OWNER = 26,

	/// StovePCMatchmaking_StartGame 함수
	STOVE_PC_MATCHMAKING_START_GAME = 27,

	/// StovePCMatchmaking_EndGame 함수
	STOVE_PC_MATCHMAKING_END_GAME = 28,	

	/// 유저 입장 콜백
	STOVE_PC_MATCHMAKING_USER_JOIN = 33,

	/// 유저 퇴장 콜백
	STOVE_PC_MATCHMAKING_USER_LEAVE = 34,

	/// 유저 정보 업데이트 콜백
	STOVE_PC_MATCHMAKING_UPDATE_LOBBY_USER = 35,

	/// 로비 메타 정보 업데이트 콜백
	STOVE_PC_MATCHMAKING_UPDATE_LOBBY_DATA = 36,

	/// 유저 프리젠스 변경 콜백
	STOVE_PC_MATCHMAKING_USER_STATUS_CHANGED = 37,

	/// StovePCMatchmaking_GetMyFriendList 함수
	STOVE_PC_MATCHMAKING_GET_MYFRIEND_LIST = 38,
};

#pragma pack(push, 4)

/*! \ingroup callback
*  \struct StovePCMatchmakingMetadata
*  \brief 메타 구조체입니다.
*/
struct StovePCMatchmakingMetadata
{
	/// 메타 데이터 키
	const wchar_t* key;

	/// 메타 데이터 값	
	const wchar_t* value;
};

/*!
*  @struct StovePCMatchmakingLobbyInfo
*  @brief 로비 구조체입니다.
*/
struct StovePCMatchmakingLobbyInfo
{
	/// 로비 아이디
	const wchar_t* lobby;
};

/*!
*  @struct StovePCMatchmakingFriendInfo
*  @brief 내 친구 구조체입니다.
*/
struct StovePCMatchmakingFriendInfo
{
	/// 유저 아이디
	unsigned __int64 UID;

	/// 유저 닉네임
	const wchar_t* nickname;

	/// 유저 프로파일
	const wchar_t*  profile;

	/// 유저 프리젠스 상태
	StovePCMatchmakingUserStatus status;
};

#pragma pack(pop)

#endif // STOVEPCMATCHMAKINGDEFINE_H_
