/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2009 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

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 "commonheaders.h"
#include <m_url.h>
#include "url.h"

HANDLE hUrlWindowList = NULL;
static HANDLE hEventContactSettingChange = NULL;
static HANDLE hContactDeleted = NULL;
static HANDLE hSRUrlMenuItem = NULL;

INT_PTR CALLBACK DlgProcUrlSend(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK DlgProcUrlRecv(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);

static INT_PTR ReadUrlCommand(WPARAM, LPARAM lParam)
{
	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_URLRECV), NULL, DlgProcUrlRecv, lParam);
	return 0;
}

static int UrlEventAdded(WPARAM wParam, LPARAM lParam)
{
	CLISTEVENT cle;
	DBEVENTINFO dbei;
	TCHAR szTooltip[256];

	ZeroMemory(&dbei, sizeof(dbei));
	dbei.cbSize = sizeof(dbei);
	dbei.cbBlob = 0;
	CallService(MS_DB_EVENT_GET, lParam, (LPARAM)&dbei);
	if (dbei.flags&(DBEF_SENT|DBEF_READ) || dbei.eventType != EVENTTYPE_URL) return 0;

	SkinPlaySound("RecvUrl");
	ZeroMemory(&cle, sizeof(cle));
	cle.cbSize = sizeof(cle);
	cle.flags = CLEF_TCHAR;
	cle.hContact = (HANDLE)wParam;
	cle.hDbEvent = (HANDLE)lParam;
	cle.hIcon = LoadSkinIcon(SKINICON_EVENT_URL);
	cle.pszService = "SRUrl/ReadUrl";
	mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("URL from %s"), pcli->pfnGetContactDisplayName((HANDLE)wParam, 0));
	cle.ptszTooltip = szTooltip;
	CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle);
	return 0;
}

static INT_PTR SendUrlCommand(WPARAM wParam, LPARAM)
{
	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_URLSEND), NULL, DlgProcUrlSend, wParam);
	return 0;
}

static void RestoreUnreadUrlAlerts(void)
{
	CLISTEVENT cle = {0};
	DBEVENTINFO dbei = {0};
	TCHAR toolTip[256];
	HANDLE hDbEvent, hContact;

	dbei.cbSize = sizeof(dbei);
	cle.cbSize = sizeof(cle);
	cle.hIcon = LoadSkinIcon(SKINICON_EVENT_URL);
	cle.pszService = "SRUrl/ReadUrl";

	hContact = db_find_first();
	while (hContact) {
		hDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDFIRSTUNREAD, (WPARAM)hContact, 0);
		while (hDbEvent) {
			dbei.cbBlob = 0;
			CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei);
			if ( !(dbei.flags&(DBEF_SENT|DBEF_READ)) && dbei.eventType == EVENTTYPE_URL) {
				cle.hContact = hContact;
				cle.hDbEvent = hDbEvent;
				cle.flags = CLEF_TCHAR;
				mir_sntprintf(toolTip, SIZEOF(toolTip), TranslateT("URL from %s"), pcli->pfnGetContactDisplayName(hContact, 0));
				cle.ptszTooltip = toolTip;
				CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle);
			}
			hDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDNEXT, (WPARAM)hDbEvent, 0);
		}
		hContact = db_find_next(hContact);
	}
}

static int ContactSettingChanged(WPARAM wParam, LPARAM lParam)
{
	DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam;
	char *szProto = GetContactProto((HANDLE)wParam);
	if (lstrcmpA(cws->szModule, "CList") && (szProto == NULL || lstrcmpA(cws->szModule, szProto)))
		return 0;

	WindowList_Broadcast(hUrlWindowList, DM_UPDATETITLE, 0, 0);
	return 0;
}

static int SRUrlPreBuildMenu(WPARAM wParam, LPARAM)
{
	CLISTMENUITEM mi = { sizeof(mi) };
	mi.flags = CMIM_FLAGS | CMIF_HIDDEN;

	char *szProto = GetContactProto((HANDLE)wParam);
	if (szProto != NULL)
		if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_URLSEND)
			mi.flags = CMIM_FLAGS;

	CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hSRUrlMenuItem, (LPARAM)&mi);
	return 0;
}

static int SRUrlModulesLoaded(WPARAM, LPARAM)
{
	CLISTMENUITEM mi = { sizeof(mi) };
	mi.position = -2000040000;
	mi.flags = CMIF_ICONFROMICOLIB;
	mi.icolibItem = GetSkinIconHandle(SKINICON_EVENT_URL);
	mi.pszName = LPGEN("Web Page Address (&URL)");
	mi.pszService = MS_URL_SENDURL;
	hSRUrlMenuItem = Menu_AddContactMenuItem(&mi);

	RestoreUnreadUrlAlerts();
	return 0;
}

static int SRUrlShutdown(WPARAM, LPARAM)
{
	if (hEventContactSettingChange)
		UnhookEvent(hEventContactSettingChange);

	if (hContactDeleted)
		UnhookEvent(hContactDeleted);

	if (hUrlWindowList)
		WindowList_BroadcastAsync(hUrlWindowList, WM_CLOSE, 0, 0);

	return 0;
}

int UrlContactDeleted(WPARAM wParam, LPARAM)
{
	HWND h = WindowList_Find(hUrlWindowList, (HANDLE)wParam);
	if (h)
		SendMessage(h, WM_CLOSE, 0, 0);

	return 0;
}

int LoadSendRecvUrlModule(void)
{
	hUrlWindowList = (HANDLE)CallService(MS_UTILS_ALLOCWINDOWLIST, 0, 0);
	HookEvent(ME_SYSTEM_MODULESLOADED, SRUrlModulesLoaded);
	HookEvent(ME_DB_EVENT_ADDED, UrlEventAdded);
	HookEvent(ME_CLIST_PREBUILDCONTACTMENU, SRUrlPreBuildMenu);
	hEventContactSettingChange = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, ContactSettingChanged);
	hContactDeleted = HookEvent(ME_DB_CONTACT_DELETED, UrlContactDeleted);
	HookEvent(ME_SYSTEM_PRESHUTDOWN, SRUrlShutdown);
	CreateServiceFunction(MS_URL_SENDURL, SendUrlCommand);
	CreateServiceFunction("SRUrl/ReadUrl", ReadUrlCommand);
	SkinAddNewSoundEx("RecvUrl", LPGEN("URL"), LPGEN("Incoming"));
	return 0;
}