/*
"Last Seen mod" plugin for Miranda IM
Copyright ( C ) 2002-03  micron-x
Copyright ( C ) 2005-07  Y.B.

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 "stdafx.h"

HINSTANCE hInstance;
HANDLE ehmissed = nullptr, ehuserinfo = nullptr, ehmissed_proto = nullptr;
HANDLE g_hShutdownEvent;
MWindowList g_pUserInfo;

int hLangpack;

PLUGININFOEX pluginInfo = {
	sizeof(PLUGININFOEX),
	__PLUGIN_NAME,
	PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
	__DESCRIPTION,
	__AUTHOR,
	__COPYRIGHT,
	__AUTHORWEB,
	UNICODE_AWARE,
	// {2D506D46-C94E-4EF8-8537-F11233A80381}
	{ 0x2d506d46, 0xc94e, 0x4ef8, { 0x85, 0x37, 0xf1, 0x12, 0x33, 0xa8, 0x03, 0x81 } }
};

#define TRANSNUMBER 2
DBVTranslation idleTr[TRANSNUMBER] = {
	{ any_to_IdleNotidleUnknown, L"Any to Idle/Not Idle/Unknown", 0 },
	{ any_to_Idle, L"Any to /Idle or empty", 0 }
};

static int CompareProtos(const char *p1, const char *p2)
{	return mir_strcmp(p1, p2);
}

BOOL includeIdle;
LIST<char> arWatchedProtos(10, CompareProtos);
LIST<logthread_info> arContacts(16, NumericKeySortT);
mir_cs csContacts;

void UninitHistoryDialog(void);

int MainInit(WPARAM, LPARAM)
{
	if (g_bFileActive = db_get_b(NULL, S_MOD, "FileOutput", 0))
		InitFileOutput();

	if (db_get_b(NULL, S_MOD, "MenuItem", 1))
		InitMenuitem();

	if (db_get_b(NULL, S_MOD, "UserinfoTab", 1))
		ehuserinfo = HookEvent(ME_USERINFO_INITIALISE, UserinfoInit);

	if (ServiceExists(MS_TIPPER_ADDTRANSLATION))
		for (int i = 0; i < TRANSNUMBER; i++)
			CallService(MS_TIPPER_ADDTRANSLATION, 0, (LPARAM)&idleTr[i]);

	return 0;
}

static int OnShutdown(WPARAM, LPARAM)
{
	SetEvent(g_hShutdownEvent);
	return 0;
}

extern "C" __declspec(dllexport) int Load(void)
{
	mir_getLP(&pluginInfo);

	g_pUserInfo = WindowList_Create();
	g_hShutdownEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);

	HookEvent(ME_SYSTEM_MODULESLOADED, MainInit);
	HookEvent(ME_SYSTEM_PRESHUTDOWN, OnShutdown);
	HookEvent(ME_OPT_INITIALISE, OptionsInit);
	HookEvent(ME_DB_CONTACT_SETTINGCHANGED, UpdateValues);
	HookEvent(ME_PROTO_ACK, ModeChange);

	includeIdle = (BOOL)db_get_b(NULL, S_MOD, "IdleSupport", 1);

	if (db_get_b(NULL, S_MOD, "MissedOnes", 0))
		ehmissed_proto = HookEvent(ME_PROTO_ACK, ModeChange_mo);

	LoadWatchedProtos();

	Skin_AddSound("LastSeenTrackedStatusChange", LPGENW("LastSeen"), LPGENW("User status change"));
	Skin_AddSound("LastSeenTrackedStatusOnline", LPGENW("LastSeen"), LPGENW("Changed to Online"));
	Skin_AddSound("LastSeenTrackedStatusOffline", LPGENW("LastSeen"), LPGENW("User Logged Off"));
	Skin_AddSound("LastSeenTrackedStatusFromOffline", LPGENW("LastSeen"), LPGENW("User Logged In"));
	return 0;
}

extern "C" __declspec(dllexport) PLUGININFOEX * MirandaPluginInfoEx(DWORD)
{
	return &pluginInfo;
}

extern "C" __declspec(dllexport) int Unload(void)
{
	UninitFileOutput();
	UnloadWatchedProtos();

	WindowList_Destroy(g_pUserInfo);

	if (ehmissed)
		UnhookEvent(ehmissed);

	CloseHandle(g_hShutdownEvent);
	UninitHistoryDialog();
	return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinst, DWORD, LPVOID)
{
	hInstance = hinst;
	return 1;
}