#include "stdafx.h"

HICON hIconNotSecure, hIconFinished, hIconPrivate, hIconUnverified;
BBButton OTRButton;

int SVC_IconPressed(WPARAM hContact, LPARAM lParam)
{
	StatusIconClickData *sicd = (StatusIconClickData *)lParam;
	if(sicd->cbSize < sizeof(StatusIconClickData))
		return 0;

	if(mir_strcmp(sicd->szModule, MODULENAME) == 0) {
		char *proto = GetContactProto(hContact);
		if(proto && db_get_b(hContact, proto, "ChatRoom", 0))
			return 0;
		ShowOTRMenu(hContact, sicd->clickLocation);
	}
	
	return 0;
}

// set SRMM icon status, if applicable
void SetEncryptionStatus(MCONTACT hContact, TrustLevel level)
{
	char *proto = GetContactProto(hContact);
	bool chat_room = (proto && db_get_b(hContact, proto, "ChatRoom", 0));

	BBButton button = OTRButton;

	StatusIconData sid = { sizeof(sid) }, sid2 = { sizeof(sid) };
	sid.szModule = MODULENAME;
	sid.dwId = 0;
	sid.flags = MBF_HIDDEN;

	sid2.szModule = MODULENAME;
	sid2.dwId = 1;
	sid2.flags = MBF_HIDDEN;

	if (!chat_room) {
		switch (level) {
		case TRUST_FINISHED:
			sid.flags = 0;
			button.ptszTooltip = TranslateW(LANG_STATUS_FINISHED);
			button.hIcon = IcoLib_GetIconHandle(ICON_FINISHED);
			break;
		case TRUST_UNVERIFIED:
			sid2.flags = MBF_DISABLED;
			button.ptszTooltip = TranslateW(LANG_STATUS_UNVERIFIED);
			button.hIcon = IcoLib_GetIconHandle(ICON_UNVERIFIED);
			break;
		case TRUST_PRIVATE:
			sid2.flags = 0;
			button.ptszTooltip = TranslateW(LANG_STATUS_PRIVATE);
			button.hIcon = IcoLib_GetIconHandle(ICON_PRIVATE);
			break;
		default:
			sid.flags = MBF_DISABLED;
			button.ptszTooltip = TranslateW(LANG_STATUS_DISABLED);
			button.hIcon = IcoLib_GetIconHandle(ICON_NOT_PRIVATE);
			break;
		}
		button.bbbFlags = 0;
	}
	else button.bbbFlags = BBSF_HIDDEN;

	Srmm_ModifyIcon(hContact, &sid);
	Srmm_ModifyIcon(hContact, &sid2);

	if (options.bHaveButtonsBar) CallService(MS_BB_SETBUTTONSTATE, hContact, (LPARAM)&button);
	db_set_dw(hContact, MODULENAME, "TrustLevel", level);

	if (!chat_room) {
		MCONTACT hMeta = db_mc_getMeta(hContact);
		if(hMeta){
			MCONTACT hMostOnline = db_mc_getMostOnline(hMeta);
			if(hContact == hMostOnline) {
				SetEncryptionStatus(hMeta, level);
			} else {
				/* in case the new most online contact has changed
				(e.g. when the otr subcontact goes offline) */
				ConnContext *context = otrl_context_find_miranda(otr_user_state, hMostOnline);
				TrustLevel encrypted = otr_context_get_trust(context);
				SetEncryptionStatus(hMeta, encrypted);
			}
		}
	}
}

int SVC_ButtonsBarLoaded(WPARAM, LPARAM)
{
	CallService(MS_BB_ADDBUTTON, 0, (LPARAM)&OTRButton);
	return 0;
}

int SVC_ButtonsBarPressed(WPARAM w, LPARAM l)
{
	CustomButtonClickData* cbcd = (CustomButtonClickData *)l;
	if (cbcd->cbSize == sizeof(CustomButtonClickData) && cbcd->dwButtonId == 0 && mir_strcmp(cbcd->pszModule, MODULENAME)==0) {
		MCONTACT hContact = (MCONTACT)w;
	
		char *proto = GetContactProto(hContact);
		if(proto && db_get_b(hContact, proto, "ChatRoom", 0))
			return 0;
		ShowOTRMenu(hContact, cbcd->pt);

	}
	return 0;
}

void InitSRMM()
{
	// add icon to srmm status icons
	InitMirOTRMenu();

	hIconNotSecure = IcoLib_GetIcon(ICON_NOT_PRIVATE, 0);
	hIconFinished = IcoLib_GetIcon(ICON_FINISHED, 0);
	hIconPrivate = IcoLib_GetIcon(ICON_PRIVATE, 0);
	hIconUnverified = IcoLib_GetIcon(ICON_UNVERIFIED, 0);

	StatusIconData sid = { sizeof(sid) };
	sid.szModule = MODULENAME;
	sid.hIcon = hIconFinished;
	sid.hIconDisabled = hIconNotSecure;
	sid.flags = MBF_DISABLED | MBF_HIDDEN;
	sid.szTooltip = LANG_OTR_TOOLTIP;
	Srmm_AddIcon(&sid);

	sid.dwId = 1;
	sid.hIcon = hIconPrivate;
	sid.hIconDisabled = hIconUnverified;
	Srmm_AddIcon(&sid);
		
	// hook the window events so that we can can change the status of the icon
	HookEvent(ME_MSG_ICONPRESSED, SVC_IconPressed);

	if (options.bHaveButtonsBar) {
		memset(&OTRButton, 0, sizeof(OTRButton));
		OTRButton.cbSize = sizeof(OTRButton);
		OTRButton.dwButtonID = 0;
		OTRButton.pszModuleName = MODULENAME;
		OTRButton.dwDefPos = 200;
		OTRButton.bbbFlags = BBBF_ISRSIDEBUTTON|BBBF_CANBEHIDDEN|BBBF_ISIMBUTTON;
		OTRButton.ptszTooltip = TranslateT(LANG_OTR_TOOLTIP);
		OTRButton.hIcon = IcoLib_GetIconHandle(ICON_NOT_PRIVATE);
		HookEvent(ME_MSG_TOOLBARLOADED, SVC_ButtonsBarLoaded);
		HookEvent(ME_MSG_BUTTONPRESSED, SVC_ButtonsBarPressed);
	}
}
void DeinitSRMM()
{
	IcoLib_Release(ICON_NOT_PRIVATE, 0);
	IcoLib_Release(ICON_FINISHED, 0);
	IcoLib_Release(ICON_PRIVATE, 0);
	IcoLib_Release(ICON_UNVERIFIED, 0);
	hIconNotSecure = hIconFinished = hIconPrivate = hIconUnverified =0;

	UninitMirOTRMenu();
}