#include "kbcmd.h"
#include "client_sdk.h"
#include "client_sdk_plugin.h"	
#include "entitydef/entitydef.h"
#include "entitydef/scriptdef_module.h"
#include "entitydef/property.h"
#include "entitydef/method.h"
#include "entitydef/datatype.h"
#include "network/fixed_messages.h"

namespace KBEngine {	

//-------------------------------------------------------------------------------------
ClientSDKPlugin::ClientSDKPlugin():
	ClientSDK(),
	initBody_()
{
}

//-------------------------------------------------------------------------------------
ClientSDKPlugin::~ClientSDKPlugin()
{

}

bool ClientSDKPlugin::create(const std::string& path)
{
	/*
	strutil::kbe_replace(filebody, "@{KBE_VERSION}", KBEVersion::versionString());
	strutil::kbe_replace(filebody, "@{KBE_SCRIPT_VERSION}", KBEVersion::scriptVersionString());
	strutil::kbe_replace(filebody, "@{KBE_SERVER_PROTO_MD5}", Network::MessageHandlers::getDigestStr());
	strutil::kbe_replace(filebody, "@{KBE_SERVER_ENTITYDEF_MD5}", EntityDef::md5().getDigestStr());
	strutil::kbe_replace(filebody, "@{KBE_USE_ALIAS_ENTITYID}", g_kbeSrvConfig.getCellApp().aliasEntityID ? "true" : "false");
	strutil::kbe_replace(filebody, "@{KBE_UPDATEHZ}", fmt::format("{}", g_kbeSrvConfig.gameUpdateHertz()));
	strutil::kbe_replace(filebody, "@{KBE_LOGIN_PORT}", fmt::format("{}", g_kbeSrvConfig.getLoginApp().externalTcpPorts_min));
	strutil::kbe_replace(filebody, "@{KBE_SERVER_EXTERNAL_TIMEOUT}", fmt::format("{}", (int)g_kbeSrvConfig.channelExternalTimeout()));*/



	basepath_ = path;

	if (basepath_[basepath_.size() - 1] != '\\' && basepath_[basepath_.size() - 1] != '/')
		basepath_ += "/";


	if (KBCMD::creatDir(basepath_.c_str()) == -1)
	{
		ERROR_MSG(fmt::format("creating directory error! path={}\n", basepath_));
		return false;
	}


	std::string configPath = basepath_ + "kbex.json";

	DEBUG_MSG(fmt::format("ClientSDK::saveFile(): {}\n",
		configPath));

	FILE* fp = fopen(configPath.c_str(), "w");

	if (NULL == fp)
	{
		ERROR_MSG(fmt::format("ClientSDK::saveFile(): fopen error! {}\n",
			configPath));

		return false;
	}


	sourcefileBody_ = fmt::format(R"({{"KBE_VERSION":"{}","KBE_SCRIPT_VERSION":"{}","KBE_SERVER_PROTO_MD5":"{}","KBE_SERVER_ENTITYDEF_MD5":"{}","KBE_USE_ALIAS_ENTITYID":"{}","KBE_UPDATEHZ":"{}","KBE_LOGIN_PORT":"{}","KBE_SERVER_EXTERNAL_TIMEOUT":"{}"}})",
		KBEVersion::versionString(),
		KBEVersion::scriptVersionString(),
		Network::MessageHandlers::getDigestStr(),
		EntityDef::md5().getDigestStr(),
		g_kbeSrvConfig.getCellApp().aliasEntityID ? "true" : "false",
		g_kbeSrvConfig.gameUpdateHertz(),
		g_kbeSrvConfig.getLoginApp().externalTcpPorts_min,
		(int)g_kbeSrvConfig.channelExternalTimeout()
	);


	size_t written = fwrite(sourcefileBody_.c_str(), 1, sourcefileBody_.size(), fp);
	if (written != sourcefileBody_.size())
	{
		ERROR_MSG(fmt::format("ClientSDK::saveFile(): fwrite error! {}\n",
			configPath));

		fclose(fp);
		return false;
	}

	if (fclose(fp))
	{
		ERROR_MSG(fmt::format("ClientSDK::saveFile(): fclose error! {}\n",
			configPath));

		return false;
	}

	return true;
}

}