#include "Mra.h"
#include "MraIcons.h"

HANDLE hXStatusAdvancedStatusIcons[MRA_XSTATUS_COUNT+4];

GUI_DISPLAY_ITEM gdiMenuItems[] =
{
	{ MRA_GOTO_INBOX,         MRA_GOTO_INBOX_STR,         IDI_INBOX,          &CMraProto::MraGotoInbox },
	{ MRA_SHOW_INBOX_STATUS,  MRA_SHOW_INBOX_STATUS_STR,  IDI_MAIL_NOTIFY,    &CMraProto::MraShowInboxStatus },
	{ MRA_EDIT_PROFILE,       MRA_EDIT_PROFILE_STR,       IDI_PROFILE,        &CMraProto::MraEditProfile },
	{ MRA_MY_ALBUM,           MRA_MY_ALBUM_STR,           IDI_MRA_PHOTO,      &CMraProto::MraViewAlbum },
	{ MRA_MY_BLOG,            MRA_MY_BLOG_STR,            IDI_MRA_BLOGS,      &CMraProto::MraReadBlog },
	{ MRA_MY_BLOGSTATUS,      MRA_MY_BLOGSTATUS_STR,      IDI_BLOGSTATUS,     &CMraProto::MraReplyBlogStatus },
	{ MRA_MY_VIDEO,           MRA_MY_VIDEO_STR,           IDI_MRA_VIDEO,      &CMraProto::MraViewVideo },
	{ MRA_MY_ANSWERS,         MRA_MY_ANSWERS_STR,         IDI_MRA_ANSWERS,    &CMraProto::MraAnswers },
	{ MRA_MY_WORLD,           MRA_MY_WORLD_STR,           IDI_MRA_WORLD,      &CMraProto::MraWorld },
	{ MRA_ZHUKI,              MRA_ZHUKI_STR,              IDI_MRA_ZHUKI,      &CMraProto::MraZhuki },
	{ MRA_WEB_SEARCH,         MRA_WEB_SEARCH_STR,         IDI_MRA_WEB_SEARCH, &CMraProto::MraWebSearch },
	{ MRA_UPD_ALL_USERS_INFO, MRA_UPD_ALL_USERS_INFO_STR, IDI_PROFILE,        &CMraProto::MraUpdateAllUsersInfo },
	{ MRA_CHK_USERS_AVATARS,  MRA_CHK_USERS_AVATARS_STR,  IDI_PROFILE,        &CMraProto::MraCheckUpdatesUsersAvt },
	{ MRA_REQ_AUTH_FOR_ALL,   MRA_REQ_AUTH_FOR_ALL_STR,   IDI_AUTHRUGUEST,    &CMraProto::MraRequestAuthForAll }
};

GUI_DISPLAY_ITEM gdiContactMenuItems[] =
{
	{ MRA_REQ_AUTH,           MRA_REQ_AUTH_STR,           IDI_AUTHRUGUEST,    &CMraProto::MraRequestAuthorization },
	{ MRA_GRANT_AUTH,         MRA_GRANT_AUTH_STR,         IDI_AUTHGRANT,      &CMraProto::MraGrantAuthorization },
	{ MRA_SEND_POSTCARD,      MRA_SEND_POSTCARD_STR,      IDI_MRA_POSTCARD,   &CMraProto::MraSendPostcard },
	{ MRA_VIEW_ALBUM,         MRA_VIEW_ALBUM_STR,         IDI_MRA_PHOTO,      &CMraProto::MraViewAlbum },
	{ MRA_READ_BLOG,          MRA_READ_BLOG_STR    ,      IDI_MRA_BLOGS,      &CMraProto::MraReadBlog },
	{ MRA_REPLY_BLOG_STATUS,  MRA_REPLY_BLOG_STATUS_STR,  IDI_BLOGSTATUS,     &CMraProto::MraReplyBlogStatus },
	{ MRA_VIEW_VIDEO,         MRA_VIEW_VIDEO_STR,         IDI_MRA_VIDEO,      &CMraProto::MraViewVideo },
	{ MRA_ANSWERS,            MRA_ANSWERS_STR,            IDI_MRA_ANSWERS,    &CMraProto::MraAnswers },
	{ MRA_WORLD,              MRA_WORLD_STR,              IDI_MRA_WORLD,      &CMraProto::MraWorld },
	{ MRA_SEND_NUDGE,         MRA_SENDNUDGE_STR,          IDI_MRA_ALARM,      NULL }
};

GUI_DISPLAY_ITEM gdiExtraStatusIconsItems[] =
{
   { ADV_ICON_DELETED_ID,        ADV_ICON_DELETED_STR,      	IDI_DELETED,        NULL },
   { ADV_ICON_NOT_ON_SERVER_ID,  ADV_ICON_NOT_ON_SERVER_STR, 	IDI_AUTHGRANT,      NULL },
   { ADV_ICON_NOT_AUTHORIZED_ID, ADV_ICON_NOT_AUTHORIZED_STR, 	IDI_AUTHRUGUEST,    NULL },
   { ADV_ICON_PHONE_ID,          ADV_ICON_PHONE_STR,           IDI_MRA_PHONE,      NULL },
   { ADV_ICON_BLOGSTATUS_ID,     ADV_ICON_BLOGSTATUS_STR,   	IDI_BLOGSTATUS,     NULL },
};

//////////////////////////////////////////////////////////////////////////////////////

static void AddIcoLibItems(LPWSTR lptszSubSectionName, GUI_DISPLAY_ITEM *pgdiItems, size_t dwCount)
{
	TCHAR tszSection[MAX_PATH], tszPath[MAX_FILEPATH];
	GetModuleFileName(masMraSettings.hInstance, tszPath, SIZEOF(tszPath));
	mir_sntprintf(tszSection, SIZEOF(tszSection), L"Protocols/MRA/%s", lptszSubSectionName);

	SKINICONDESC sid = { sizeof(sid) };
	sid.ptszSection = tszSection;
	sid.ptszDefaultFile = tszPath;
	sid.cx = sid.cy = 16;
	sid.flags = SIDF_ALL_UNICODE;

	if (lptszSubSectionName == NULL)
		lptszSubSectionName = _T("");

	for (size_t i = 0;i<dwCount;i++) {
		char szBuff[MAX_PATH];
		mir_snprintf(szBuff, SIZEOF(szBuff), "MRA_%s", pgdiItems[i].lpszName);

		sid.pszName = szBuff;
		sid.pwszDescription = pgdiItems[i].lpwszDescr;
		sid.iDefaultIndex = -pgdiItems[i].defIcon;
		pgdiItems[i].hIconHandle = Skin_AddIcon(&sid);
	}
}

HICON IconLibGetIcon(HANDLE hIcon)
{
	return IconLibGetIconEx(hIcon, LR_SHARED);
}

HICON IconLibGetIconEx(HANDLE hIcon, DWORD dwFlags)
{
	HICON hiIcon = NULL;
	if (hIcon) {
		hiIcon = Skin_GetIconByHandle(hIcon);
		if ((dwFlags & LR_SHARED) == 0)
			hiIcon = CopyIcon(hiIcon);
	}
	return hiIcon;
}

//////////////////////////////////////////////////////////////////////////////////////

void IconsLoad()
{
	AddIcoLibItems(LPGENT("Main Menu"), gdiMenuItems, SIZEOF(gdiMenuItems));
	AddIcoLibItems(LPGENT("Contact Menu"), gdiContactMenuItems, SIZEOF(gdiContactMenuItems));

	// Advanced Status Icons initialization
	AddIcoLibItems(LPGENT("Extra status"), gdiExtraStatusIconsItems, SIZEOF(gdiExtraStatusIconsItems));
}

void InitXStatusIcons()
{
	WCHAR wszPath[MAX_FILEPATH];
	if (masMraSettings.hDLLXStatusIcons)
		GetModuleFileName(masMraSettings.hDLLXStatusIcons, wszPath, SIZEOF(wszPath));
	else
		bzero(wszPath, sizeof(wszPath));

	SKINICONDESC sid = { sizeof(sid) };
	sid.pwszSection = L"Protocols/MRA/"LPGENT("Custom Status");
	sid.pwszDefaultFile = wszPath;
	sid.cx = sid.cy = 16;
	sid.flags = SIDF_ALL_UNICODE;

	hXStatusAdvancedStatusIcons[0] = NULL;
	for (int i = 1; i < MRA_XSTATUS_COUNT+1; i++) {
		char szBuff[MAX_PATH];
		mir_snprintf(szBuff, SIZEOF(szBuff), "mra_xstatus%ld", i);
		sid.pszName = szBuff;

		int iCurIndex = i+IDI_XSTATUS1-1;
		sid.pwszDescription = lpcszXStatusNameDef[i];
		sid.iDefaultIndex = -iCurIndex;

		hXStatusAdvancedStatusIcons[i] = Skin_AddIcon(&sid);
	}
}

void DestroyXStatusIcons()
{
	char szBuff[MAX_PATH];

	for (size_t i = 1; i < MRA_XSTATUS_COUNT+1; i++) {
		mir_snprintf(szBuff, SIZEOF(szBuff), "mra_xstatus%ld", i);
		Skin_RemoveIcon(szBuff);
	}

	bzero(hXStatusAdvancedStatusIcons, sizeof(hXStatusAdvancedStatusIcons));
}

/////////////////////////////////////////////////////////////////////////////////////////

void CMraProto::InitMainMenu()
{
	HICON hMainIcon = (HICON)LoadImage(masMraSettings.hInstance, MAKEINTRESOURCE(IDI_MRA), IMAGE_ICON, 0, 0, LR_SHARED);
	CListCreateMenu(200001, 500085000, hMainIcon, NULL, TRUE, gdiMenuItems, SIZEOF(gdiMenuItems), hMainMenuItems);
}

void CMraProto::InitContactMenu()
{
	CListCreateMenu(2000060000, -500050000, NULL, NULL, FALSE, gdiContactMenuItems, SIZEOF(gdiContactMenuItems), hContactMenuItems);
}

void CMraProto::CListCreateMenu(LONG lPosition, LONG lPopupPosition, HICON hMainIcon, LPSTR pszContactOwner, BOOL bIsMain, const GUI_DISPLAY_ITEM *pgdiItems, size_t dwCount, HGENMENU *hResult)
{
	if (!pgdiItems || !dwCount || !hResult)
		return;

	char szServiceFunction[MAX_PATH], *pszServiceFunctionName;
	strncpy(szServiceFunction, m_szModuleName, sizeof(szServiceFunction));
	pszServiceFunctionName = szServiceFunction + strlen(m_szModuleName);

	CLISTMENUITEM mi = { sizeof(mi) };
	mi.position = -1999901008;

	HGENMENU (*fnAddFunc)(CLISTMENUITEM*);
	if (bIsMain) {
		fnAddFunc = Menu_AddProtoMenuItem;

		HGENMENU hRootMenu = MO_GetProtoRootMenu(m_szModuleName);
		if (hRootMenu == NULL) {
			mi.ptszName = m_tszUserName;
			mi.hParentMenu = HGENMENU_ROOT;
			mi.flags = CMIF_ROOTPOPUP | CMIF_TCHAR | CMIF_KEEPUNTRANSLATED;
			mi.hIcon = hMainIcon;
			hRootMenu = Menu_AddProtoMenuItem(&mi);
		}
		mi.hParentMenu = hRootMenu;
		mi.flags = CMIF_UNICODE | CMIF_CHILDPOPUP;
	}
	else {
		fnAddFunc = Menu_AddContactMenuItem;
		mi.ptszPopupName = m_tszUserName;
		mi.flags = CMIF_UNICODE;
	}

	mi.popupPosition = lPopupPosition;
	mi.pszService = szServiceFunction;

	for (size_t i = 0; i < dwCount; i++) {
		memmove(pszServiceFunctionName, pgdiItems[i].lpszName, lstrlenA(pgdiItems[i].lpszName)+1);
		if (pgdiItems[i].lpFunc)
			CreateObjectSvc(pgdiItems[i].lpszName, pgdiItems[i].lpFunc);
		mi.position = int(lPosition + i);
		mi.icolibItem = pgdiItems[i].hIconHandle;
		mi.ptszName = pgdiItems[i].lpwszDescr;
		hResult[i] = fnAddFunc(&mi);
	}
}