#include "stdafx.h"

void MakeMenuItem(lua_State *L, CMenuItem &mi)
{
	mi.hLangpack = hScriptsLangpack;

	lua_pushliteral(L, "Flags");
	lua_gettable(L, -2);
	mi.flags = lua_tointeger(L, -1);
	lua_pop(L, 1);

	if (!(mi.flags & CMIF_TCHAR))
		mi.flags |= CMIF_TCHAR;

	lua_pushliteral(L, "Uid");
	lua_gettable(L, -2);
	const char* uuid = (char*)lua_tostring(L, -1);
	if (UuidFromStringA((RPC_CSTR)uuid, (UUID*)&mi.uid))
		UNSET_UID(mi);
	lua_pop(L, 1);

	lua_pushliteral(L, "Name");
	lua_gettable(L, -2);
	mi.name.t = mir_utf8decodeT((char*)luaL_checkstring(L, -1));
	lua_pop(L, 1);

	lua_pushliteral(L, "Position");
	lua_gettable(L, -2);
	mi.position = lua_tointeger(L, -1);
	lua_pop(L, 1);

	lua_pushliteral(L, "Icon");
	lua_gettable(L, -2);
	mi.hIcolibItem = (HANDLE)lua_touserdata(L, -1);
	lua_pop(L, 1);

	lua_pushliteral(L, "Service");
	lua_gettable(L, -2);
	mi.pszService = (char*)lua_tostring(L, -1);
	lua_pop(L, 1);

	lua_pushliteral(L, "Parent");
	lua_gettable(L, -2);
	mi.root = (HGENMENU)lua_touserdata(L, -1);
	lua_pop(L, 1);
}

static int lua_CreateRoot(lua_State *L)
{
	int hMenuObject = lua_tointeger(L, 1);
	const char *name = luaL_checkstring(L, 2);
	int position = lua_tointeger(L, 3);
	HANDLE hIcon = (HANDLE)lua_touserdata(L, 4);

	HGENMENU res = Menu_CreateRoot(hMenuObject, ptrT(Utf8DecodeT(name)), position, hIcon);
	lua_pushlightuserdata(L, res);

	return 1;
}

static int lua_AddMenuItem(lua_State *L)
{
	int hMenuObject = lua_tointeger(L, 1);

	if (lua_type(L, 2) != LUA_TTABLE)
	{
		lua_pushlightuserdata(L, 0);
		return 1;
	}

	CMenuItem mi;
	MakeMenuItem(L, mi);

	HGENMENU res = ::Menu_AddItem(hMenuObject, &mi, NULL);
	lua_pushlightuserdata(L, res);

	return 1;
}

static int lua_ModifyMenuItem(lua_State *L)
{
	HGENMENU hMenuItem = (HGENMENU)lua_touserdata(L, 1);
	ptrT name(mir_utf8decodeT(lua_tostring(L, 2)));
	HANDLE hIcolibItem = lua_touserdata(L, 3);
	int flags = lua_tointeger(L, 4);

	if (!(flags & CMIF_UNICODE))
		flags |= CMIF_UNICODE;

	INT_PTR res = ::Menu_ModifyItem(hMenuItem, name, hIcolibItem, flags);
	lua_pushinteger(L, res);
	return 1;
}

static int lua_ShowMenuItem(lua_State *L)
{
	HGENMENU hMenuItem = (HGENMENU)lua_touserdata(L, 1);
	bool isShow = luaM_toboolean(L, 2);

	::Menu_ShowItem(hMenuItem, isShow);

	return 0;
}

static int lua_EnableMenuItem(lua_State *L)
{
	HGENMENU hMenuItem = (HGENMENU)lua_touserdata(L, 1);
	bool isEnable = luaM_toboolean(L, 2);

	::Menu_EnableItem(hMenuItem, isEnable);

	return 0;
}

static int lua_CheckMenuItem(lua_State *L)
{
	HGENMENU hMenuItem = (HGENMENU)lua_touserdata(L, 1);
	bool isChecked = luaM_toboolean(L, 2);

	::Menu_SetChecked(hMenuItem, isChecked);

	return 0;
}

static int lua_RemoveMenuItem(lua_State *L)
{
	HGENMENU hMenuItem = (HGENMENU)lua_touserdata(L, 1);

	INT_PTR res = ::Menu_RemoveItem(hMenuItem);
	lua_pushinteger(L, res);

	return 1;
}

static luaL_Reg genmenuApi[] =
{
	{ "CreateRoot", lua_CreateRoot },
	{ "AddMenuItem", lua_AddMenuItem },
	{ "ModifyMenuItem", lua_ModifyMenuItem },
	{ "ShowMenuItem", lua_ShowMenuItem },
	{ "EnableMenuItem", lua_EnableMenuItem },
	{ "CheckMenuItem", lua_CheckMenuItem },
	{ "RemoveMenuItem", lua_RemoveMenuItem },

	{ "MO_MAIN", NULL },
	{ "MO_CONTACT", NULL },

	{ NULL, NULL }
};

LUAMOD_API int luaopen_m_genmenu(lua_State *L)
{
	luaL_newlib(L, genmenuApi);
	lua_pushinteger(L, MO_MAIN);
	lua_setfield(L, -2, "MO_MAIN");
	lua_pushinteger(L, MO_CONTACT);
	lua_setfield(L, -2, "MO_CONTACT");

	return 1;
}