// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010  Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.


/*
 * Login system example, client.
 *
 * This client connects to a front-end server using login system.
 *
 * Before running this client, the front end service sample must run,
 * and also the NeL naming_service, time_service, login_service, welcome_service.
 *
 */

//
// Includes
//

#include <string>

#include "nel/misc/types_nl.h"
#include "nel/misc/debug.h"
#include "nel/misc/config_file.h"
#include "nel/misc/bit_mem_stream.h"
#include "nel/misc/path.h"

#include "nel/net/callback_client.h"

#ifdef NL_OS_WINDOWS
#include <conio.h>
#else
#include "kbhit.h"
#endif

using namespace std;
using namespace NLMISC;
using namespace NLNET;

// Really simple chat
// Do not display what you are typing

#ifdef NL_OS_WINDOWS
#define KEY_ESC		27
#define KEY_ENTER	13
#else
#define KEY_ESC		27
#define KEY_ENTER	10
#endif

#ifndef CHAT_DIR
#	define CHAT_DIR "."
#endif

string CurrentEditString;

// ***************************************************************************
void serverSentChat (CMessage &msgin, TSockId from, CCallbackNetBase &netbase)
{
	// Called when the server sent a CHAT message
	string text;
	msgin.serial(text);
	printf("%s\n", text.c_str());
}

// ***************************************************************************
// All messages handled by this server
#define NB_CB 1
TCallbackItem CallbackArray[NB_CB] =
{
	{ "CHAT", serverSentChat }
};

/*
 * main
 */
int main (int argc, char **argv)
{
	NLMISC::CApplicationContext applicationContext;

	CCallbackClient *Client;

	NLMISC::CPath::addSearchPath(CHAT_DIR);

	// Read the host where to connect in the client.cfg file
	CConfigFile ConfigFile;	
	ConfigFile.load (NLMISC::CPath::lookup("client.cfg"));
	string LSHost(ConfigFile.getVar("LSHost").asString());

	// Init and Connect the client to the server located on port 3333
	Client = new CCallbackClient();
	Client->addCallbackArray (CallbackArray, NB_CB);

	printf("Please wait connecting...\n");
	try
	{
		CInetAddress addr(LSHost+":3333");
		Client->connect(addr);
	}
	catch(const ESocket &e)
	{
		printf("%s\n", e.what());
		return 0;
	}

	if (!Client->connected())
	{
		printf("Connection Error\n");
		return 0;
	}
	printf("Connected.\n");

#ifdef NL_OS_UNIX
	init_keyboard();
#endif
	// The main loop
	do
	{
		int c;
		if (kbhit())
		{
			c = getch();
			if (c == KEY_ESC)
			{
				break; // FINSIH
			}
			else if (c == KEY_ENTER)
			{
				CMessage msg;
				msg.setType("CHAT");
				msg.serial (CurrentEditString);
				Client->send(msg);
				CurrentEditString = "";
			}
			else
			{
				CurrentEditString += c;
			}
		}
		Client->update();
	}
	while (Client->connected());

#ifdef NL_OS_UNIX
	close_keyboard();
#endif
	// Finishing
	delete Client;
}