////////////////////////////////////////////////////////////////////////////////
// Gadu-Gadu Plugin for Miranda IM
//
// Copyright (c) 2011-2012 Bartosz BiaƂek
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
////////////////////////////////////////////////////////////////////////////////

#include "gg.h"

struct PopupData
{
	unsigned flags;
	wchar_t* title;
	wchar_t* text;
	GaduProto* gg;
};

/////////////////////////////////////////////////////////////////////////////////////////
// Popup plugin window proc
//
LRESULT CALLBACK PopupWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	case WM_COMMAND:
	{
		PopupData* puData = (PopupData*)PUGetPluginData(hWnd);
		if (puData != nullptr)
		{
			if (puData->flags & GG_POPUP_MULTILOGON)
				puData->gg->sessions_view(0, 0);
		}
		PUDeletePopup(hWnd);
		break;
	}

	case WM_CONTEXTMENU:
		PUDeletePopup(hWnd);
		break;

	case UM_FREEPLUGINDATA:
	{
		PopupData* puData = (PopupData*)PUGetPluginData(hWnd);
		if (puData != nullptr && puData != (PopupData*)CALLSERVICE_NOTFOUND)
		{
			mir_free(puData->title);
			mir_free(puData->text);
			mir_free(puData);
		}
		break;
	}
	}

	return DefWindowProc(hWnd, msg, wParam, lParam);
}

/////////////////////////////////////////////////////////////////////////////////////////
// Popup plugin class registration
//
void GaduProto::initpopups()
{
	wchar_t szDescr[256];
	char  szName[256];

	POPUPCLASS puc = {};
	puc.PluginWindowProc = PopupWindowProc;
	puc.flags = PCF_UNICODE;
	puc.pszName = szName;
	puc.pszDescription.w = szDescr;

	mir_snprintf(szName, "%s_%s", m_szModuleName, "Notify");
	mir_snwprintf(szDescr, L"%s/%s", m_tszUserName, TranslateT("Notifications"));
	puc.colorBack = RGB(173, 206, 247);
	puc.colorText = GetSysColor(COLOR_WINDOWTEXT);
	puc.hIcon = g_plugin.getIcon(IDI_GG);
	puc.iSeconds = 4;
	hPopupNotify = Popup_RegisterClass(&puc);

	mir_snprintf(szName, "%s_%s", m_szModuleName, "Error");
	mir_snwprintf(szDescr, L"%s/%s", m_tszUserName, TranslateT("Errors"));
	puc.colorBack = RGB(191, 0, 0); // Red
	puc.colorText = RGB(255, 245, 225); // Yellow
	puc.iSeconds = 60;
	puc.hIcon = (HICON)LoadImage(nullptr, IDI_WARNING, IMAGE_ICON, 0, 0, LR_SHARED);
	hPopupError = Popup_RegisterClass(&puc);
}

/////////////////////////////////////////////////////////////////////////////////////////
// Show popup - popup plugin support
//
void CALLBACK sttMainThreadCallback(PVOID dwParam)
{
	PopupData *puData = (PopupData*)dwParam;
	GaduProto *gg = puData->gg;

	char szName[256];
	if (puData->flags & GG_POPUP_ERROR || puData->flags & GG_POPUP_WARNING)
		mir_snprintf(szName, "%s_%s", gg->m_szModuleName, "Error");
	else
		mir_snprintf(szName, "%s_%s", gg->m_szModuleName, "Notify");

	POPUPDATACLASS ppd = {};
	ppd.szTitle.w = puData->title;
	ppd.szText.w = puData->text;
	ppd.PluginData = puData;
	ppd.pszClassName = szName;
	Popup_AddClass(&ppd);
}

void GaduProto::showpopup(const wchar_t* nickname, const wchar_t* msg, int flags)
{
	if (Miranda_IsTerminated())
		return;

	PopupData *puData = (PopupData*)mir_calloc(sizeof(PopupData));
	puData->flags = flags;
	puData->title = mir_wstrdup(nickname);
	puData->text = mir_wstrdup(msg);
	puData->gg = this;

	CallFunctionAsync(sttMainThreadCallback, puData);
}