/*! \example stove_pc_matchmaking_sample.h
*  \brief StovePCMatchmaking64.dll을 사용하여 작성한 콘솔 샘플 프로그램입니다.
*/
#include <iostream>

#include <StovePCMatchmakingDefine.h>
#include <StovePCMatchmakingCallback.h>
#include "MetadataHelper.h"

#include <string>
#include <vector>
#include <codecvt>

extern std::wstring myLobby;

// 서버 접속 콜백
void OnConnect(const StovePCMatchmakingError error)
{
	if (STOVE_PC_MATCHMAKING_NO_ERROR == error.result)
		std::wcout << L"- Success" << std::endl;
	else 
		std::wcout << L"- failed, code = " << error.result << std::endl;
}

// 서버 접속 종료 콜백
void OnDisconnect(const StovePCMatchmakingError error, const StovePCMatchmakingDisconnectCode code)
{	
	// 접속 종료 코드 ( ::StovePCMatchmakingDisconnectCode 참고합니다 )
	std::wcout << L"- Disconnect code = " << code << std::endl;
}

// 로비 생성 콜백
void OnCreateLobby(const StovePCMatchmakingError error, const StovePCMatchmakingCreateLobby createLobby)
{
	if (STOVE_PC_MATCHMAKING_NO_ERROR == error.result)
		std::wcout << L"- Success" << std::endl;
	else
		std::wcout << L"- failed, code = " << error.result << std::endl;

	// 생성한 로비 아이디
	std::wcout << L"- Create Lobby = " << createLobby.lobby << std::endl;	
}

	// 로비 입장 콜백
void OnJoinLobby(const StovePCMatchmakingError error, const StovePCMatchmakingJoinLobby joinLobby)
{
	if (STOVE_PC_MATCHMAKING_NO_ERROR == error.result)
		std::wcout << L"- Success" << std::endl;
	else
		std::wcout << L"- failed, code = " << error.result << std::endl;

	// 입장한 로비명
	std::wcout << L"- Join Lobby = " << joinLobby.lobby << std::endl;
	std::wcout << "== config ==";
	MetadataHelper config(joinLobby.lobbyDataArray, joinLobby.lobbyDataCount);		// 로비 데이터 배열을 맵으로 변환
	for (auto pair : config)
	{
		std::wcout << pair.first << " : " << pair.second << std::endl;
	}

	myLobby = joinLobby.lobby;
}

// 로비 설정 업데이트 콜백
void OnUpdateLobbyData(const StovePCMatchmakingError error, const StovePCMatchmakingUpdateLobbyData updateLobbyData)
{
	std::wcout << L"update lobby = " << updateLobbyData.lobby				// 로비명
		<< std::endl;

	std::wcout << "== config ==";
	MetadataHelper config(updateLobbyData.lobbyDataArray, updateLobbyData.lobbyDataCount);		// 로비 데이터 배열을 맵으로 변환
	for (auto pair : config)
	{
		std::wcout << pair.first << " : " << pair.second << std::endl;
	}
}

// 로비 퇴장 콜백
void OnLeaveLobby(const StovePCMatchmakingError error, const StovePCMatchmakingLeaveLobby leaveLobby)
{
	std::wcout << L"- Leave Lobby = " << leaveLobby.lobby << std::endl;

	// 퇴장 코드 ( ::StovePCMatchmakingResult 참고합니다 )
	std::wcout << L"leave lobby code = " << error.result << std::endl;
}

// 로비 유저 입장 콜백
void OnUserJoin(const StovePCMatchmakingError error, const StovePCMatchmakingUserJoin userJoin)
{
	// 입장한 로비명
	std::wcout << L"user join lobby = " << userJoin.lobby
		<< L"UID = " << userJoin.UID							// 입장한 유저 아이디
		<< L"nickname = " << userJoin.nickname					// 입장한 유저 닉네임
		<< L"affiliation = " << userJoin.affiliation			// 입장한 유저 등급
		<< std::endl;

	std::wcout << "== user data ==";
	MetadataHelper config(userJoin.userDataArray, userJoin.userDataCount);		// 유저 데이터 배열을 맵으로 변환
	for (auto pair : config)
	{
		std::wcout << pair.first << " : " << pair.second << std::endl;
	}
}

// 로비 유저 상태값 업데이트 콜백
void OnUpdateLobbyUser(const StovePCMatchmakingError error, const StovePCMatchmakingUpdateLobbyUser updateLobbyUser)
{
	std::wcout << L"update user lobby = " << updateLobbyUser.lobby		// 로비명
		<< L"UID = " << updateLobbyUser.UID							// 유저 아이디
		<< L"nickname = " << updateLobbyUser.nickname				// 입장한 유저 닉네임
		<< L"affiliation = " << updateLobbyUser.affiliation			// 유저 등급
		<< std::endl;

	std::wcout << "== user data ==";
	MetadataHelper config(updateLobbyUser.userDataArray, updateLobbyUser.userDataCount);		// 유저 데이터 배열을 맵으로 변환
	for (auto pair : config)
	{
		std::wcout << pair.first << " : " << pair.second << std::endl;
	}
}

// 로비 유저 퇴장 콜백
void OnUserLeave(const StovePCMatchmakingError error, const StovePCMatchmakingUserLeave userLeave)
{
	std::wcout << L"user leave lobby = " << userLeave.lobby				// 퇴장한 로비명
		<< L"UID = " << userLeave.UID							// 퇴장한 유저 아이디
		<< L"nickname = " << userLeave.nickname				// 퇴장한 유저 닉네임
		<< L"leave code = " << error.result				// 퇴장 코드 ( ::StovePCMatchmakingResult 참고합니다 )
		<< std::endl;
}