/*
	BossKey - Hide Miranda from your boss :)
	Copyright (C) 2002-2003 Goblineye Entertainment, (C) 2007-2010 Billy_Bons

    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 "BossKey.h"
extern HANDLE g_hIsHiddenService;

static INT_PTR CALLBACK DlgProcOptsBossKeyTrigger(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {

	switch (msg) {
	case WM_INITDIALOG: {
		/* lParam = (LPARAM)(DWORD)triggerID, or 0 if this is a new trigger */
		DWORD triggerID;

		triggerID = (DWORD)lParam;
		TranslateDialogDefault(hwndDlg);
		CheckDlgButton(hwndDlg, IDC_BK_HIDE, (DBGetTriggerSettingWord(triggerID, NULL, MOD_NAME, SETTING_TRIGGERON, 0)&TRIGGER_BK_HIDE)?BST_CHECKED:BST_UNCHECKED);
		CheckDlgButton(hwndDlg, IDC_BK_SHOW, (DBGetTriggerSettingWord(triggerID, NULL, MOD_NAME, SETTING_TRIGGERON, 0)&TRIGGER_BK_SHOW)?BST_CHECKED:BST_UNCHECKED);
		break;
		}

	case TM_ADDTRIGGER: {	
		DWORD triggerID;
		int flags = 0;
		
		triggerID = (DWORD)wParam;
		flags |= IsDlgButtonChecked(hwndDlg, IDC_BK_HIDE)?TRIGGER_BK_HIDE:0;
		flags |= IsDlgButtonChecked(hwndDlg, IDC_BK_SHOW)?TRIGGER_BK_SHOW:0;
		DBWriteTriggerSettingWord(triggerID, NULL, MOD_NAME, SETTING_TRIGGERON, (WORD)flags);
		break;
		}

	case TM_DELTRIGGER: {	
		DWORD triggerID;
		REMOVETRIGGERSETTINGS rts;
		
		triggerID = (DWORD)wParam;
		rts.cbSize = sizeof(REMOVETRIGGERSETTINGS);
		rts.prefix = PREFIX_TRIGGERID;
		rts.id = triggerID;
		rts.hContact = NULL;
		rts.szModule = MOD_NAME;
		CallService(MS_TRIGGER_REMOVESETTINGS, 0, (LPARAM)&rts);
		break;
		}
	}

	return FALSE;
}

int BossKeyEvent(WPARAM wParam, LPARAM lParam) {

	DWORD triggerID = 0;
	REPORTINFO ri;
	TRIGGERDATA td;
	int flags;

	do {
		triggerID = (DWORD)CallService(MS_TRIGGER_FINDNEXTTRIGGERID, triggerID, (LPARAM)TRIGGERNAME);
		if (triggerID == 0) {
			continue;
		}
		ZeroMemory(&td, sizeof(TRIGGERDATA));
		td.cbSize = sizeof(TRIGGERDATA);
		flags = DBGetTriggerSettingWord(triggerID, NULL, MOD_NAME, SETTING_TRIGGERON, 0);
		switch (wParam) {
		case 0:
			if (!(flags&TRIGGER_BK_HIDE)) {
				continue;
			}
			break;
		case 1:
			if (!(flags&TRIGGER_BK_SHOW)) {
				continue;
			}
			break;
		default:
			continue;
			break;
		}
		ZeroMemory(&ri, sizeof(REPORTINFO));
		ri.cbSize = sizeof(REPORTINFO);
		ri.flags = TRG_PERFORM;
		ri.triggerID = triggerID;
		ri.td = &td;
		CallService(MS_TRIGGER_REPORTEVENT, 0, (LPARAM)&ri);
	} while (triggerID != 0);

	return 0;
}

INT_PTR IsMirandaHidden(WPARAM wParam, LPARAM lParam) // for trigger plugin
{
	return (INT_PTR)g_bWindowHidden;
}

int RegisterTrigger() {

	g_hIsHiddenService = CreateServiceFunction(MS_BOSSKEY_ISMIRANDAHIDDEN, IsMirandaHidden);

	TRIGGERREGISTER tr;
	ZeroMemory(&tr, sizeof(TRIGGERREGISTER));
	tr.cbSize = sizeof(TRIGGERREGISTER);
	tr.dFlags = DF_TCHAR;
	tr.pszName = Translate(TRIGGERNAME);
	tr.hInstance = g_hInstance;
	tr.pfnDlgProc = DlgProcOptsBossKeyTrigger;
	tr.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_TRIGGER);

	CallService(MS_TRIGGER_REGISTERTRIGGER, 0, (LPARAM)&tr);

	CONDITIONREGISTER cr;
	ZeroMemory(&cr, sizeof(CONDITIONREGISTER));
	cr.cbSize = sizeof(CONDITIONREGISTER);
	cr.flags = CRF_TCHAR;
	cr.pszName = "BossKey: Miranda is hidden";
	cr.pszService = MS_BOSSKEY_ISMIRANDAHIDDEN;

	CallService(MS_TRIGGER_REGISTERCONDITION, 0, (LPARAM)&cr);

	ACTIONREGISTER ar;
	ZeroMemory(&ar, sizeof(ACTIONREGISTER));
	ar.cbSize = sizeof(ACTIONREGISTER);
	ar.flags = ARF_TCHAR;
	ar.pszName = "BossKey: Hide/Show Miranda";
	ar.pszService = MS_BOSSKEY_HIDE;

	CallService(MS_TRIGGER_REGISTERACTION, 0, (LPARAM)&ar);

	return 0;
}