#define __SKYPESVC_C__
#include "skype.h"
#include "skypesvc.h"
#include "skypeapi.h"
#include "skypeopt.h"
#include "contacts.h"
#include "m_toptoolbar.h"

// Exports
SKYPE_SVCNAMES	g_svcNames;

//From skype.c
extern char protocol, g_szProtoName[];
extern HINSTANCE hInst;
extern DWORD mirandaVersion;
static HANDLE m_hPrebuildCMenu=NULL, m_hStatusHookContact=NULL, m_hContactDeleted=NULL, 
	m_hHookModulesLoaded=NULL, m_hHookOkToExit=NULL, m_hOptHook=NULL, m_hHookMirandaExit=NULL,
	m_hTTBModuleLoadedHook = NULL, m_hHookOnUserInfoInit = NULL;

void CreateProtoService(const char* szService, MIRANDASERVICE svc)
{
	char str[MAXMODULELABELLENGTH];
	_snprintf(str, sizeof(str), "%s%s", SKYPE_PROTONAME, szService);
	CreateServiceFunction(str, svc);
}

#define CreateServiceName(srvce) _snprintf (g_svcNames.##srvce, sizeof(g_svcNames.##srvce), "%s/"#srvce, SKYPE_PROTONAME);

void CreateServices(void)
{
	CreateServiceName(ChatNew);
	CreateServiceName(SetAvatar);
	CreateServiceName(SendFile);
	CreateServiceName(HoldCall);
	CreateServiceName(AnswerCall);
	CreateServiceName(ImportHistory);
	CreateServiceName(AddUser);
	CreateServiceName(SkypeOutCallUser);
	CreateServiceName(CallHangupUser);
	CreateServiceName(CallUser);

	CreateServiceFunction(SKYPE_CALL, SkypeCall);
	CreateServiceFunction(SKYPE_CALLHANGUP, SkypeCallHangup);
	CreateServiceFunction(SKYPEOUT_CALL, SkypeOutCall);
	CreateServiceFunction(SKYPE_HOLDCALL, SkypeHoldCall);
	CreateServiceFunction(SKYPE_ADDUSER, SkypeAdduserDlg);
	CreateServiceFunction(SKYPE_IMPORTHISTORY, ImportHistory);
	CreateServiceFunction(SKYPE_ANSWERCALL, SkypeAnswerCall);
	CreateServiceFunction(SKYPE_SENDFILE, SkypeSendFile);
	CreateServiceFunction(SKYPE_SETAVATAR, SkypeSetAvatar);

	CreateProtoService(PS_GETCAPS, SkypeGetCaps);
	CreateProtoService(PS_GETNAME, SkypeGetName);
	CreateProtoService(PS_LOADICON, SkypeLoadIcon);
	CreateProtoService(PS_SETSTATUS, SkypeSetStatus);
	CreateProtoService(PS_GETSTATUS, SkypeGetStatus);
	CreateProtoService(PS_ADDTOLIST, SkypeAddToList);
	CreateProtoService(PS_ADDTOLISTBYEVENT, SkypeAddToListByEvent);
	CreateProtoService(PS_BASICSEARCH, SkypeBasicSearch);

	CreateProtoService(PSS_GETINFO, SkypeGetInfo);
	CreateProtoService(PSS_MESSAGE, SkypeSendMessage);
	CreateProtoService(PSR_MESSAGE, SkypeRecvMessage);
	CreateProtoService(PSS_USERISTYPING, SkypeUserIsTyping);
	CreateProtoService(PSS_AUTHREQUEST, SkypeSendAuthRequest);
	CreateProtoService(PSR_AUTH, SkypeRecvAuth);
	CreateProtoService(PS_AUTHALLOW, SkypeAuthAllow);
	CreateProtoService(PS_AUTHDENY, SkypeAuthDeny);

	CreateProtoService(PS_GETAVATARINFO, SkypeGetAvatarInfo);
	CreateProtoService(PS_GETAVATARCAPS, SkypeGetAvatarCaps);
	CreateProtoService(PS_GETMYAVATAR, SkypeGetAvatar);
	CreateProtoService(PS_SETMYAVATAR, SkypeSetAvatar);

	CreateProtoService(PS_SETAWAYMSG, SkypeSetAwayMessage);
	CreateProtoService(PS_SETAWAYMSGW, SkypeSetAwayMessageW);
	CreateProtoService(PSS_GETAWAYMSG, SkypeGetAwayMessage);
	CreateProtoService(PS_SETMYNICKNAME, SkypeSetNick);

	CreateProtoService(PSS_SKYPEAPIMSG, SkypeReceivedAPIMessage);
	CreateProtoService(SKYPE_REGPROXY, SkypeRegisterProxy);
}

void HookEvents(void)
{
	m_hPrebuildCMenu = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildContactMenu);

	//HookEvent(ME_CLIST_DOUBLECLICKED, ClistDblClick);
	m_hOptHook = HookEvent(ME_OPT_INITIALISE, RegisterOptions);
	m_hStatusHookContact = HookEvent(ME_DB_CONTACT_ADDED,HookContactAdded);
	m_hContactDeleted = HookEvent( ME_DB_CONTACT_DELETED, HookContactDeleted );
	m_hHookModulesLoaded = HookEvent( ME_SYSTEM_MODULESLOADED, OnModulesLoaded);
	m_hHookMirandaExit = HookEvent(ME_SYSTEM_OKTOEXIT, MirandaExit);
	m_hHookOkToExit = HookEvent(ME_SYSTEM_PRESHUTDOWN, OkToExit);
}

void HookEventsLoaded(void)
{
	// We cannot check for the TTB-service before this event gets fired... :-/
	m_hTTBModuleLoadedHook = HookEvent(ME_TTB_MODULELOADED, CreateTopToolbarButton);
	m_hHookOnUserInfoInit = HookEvent( ME_USERINFO_INITIALISE, OnDetailsInit );
}

void UnhookEvents(void)
{
	UnhookEvent(m_hOptHook);
	UnhookEvent(m_hTTBModuleLoadedHook);
	UnhookEvent(m_hHookOnUserInfoInit);
	UnhookEvent(m_hStatusHookContact);
	UnhookEvent(m_hContactDeleted);
	UnhookEvent(m_hHookModulesLoaded);
	UnhookEvent(m_hPrebuildCMenu);
	UnhookEvent(m_hHookOkToExit);
	UnhookEvent(m_hHookMirandaExit);
	//UnhookEvent(ClistDblClick);
}

INT_PTR SkypeGetCaps(WPARAM wParam, LPARAM lParam) {
    int ret = 0;

	UNREFERENCED_PARAMETER(lParam);

    switch (wParam) {        
        case PFLAGNUM_1:
			ret = PF1_BASICSEARCH | PF1_IM | PF1_MODEMSG; // | PF1_AUTHREQ;
			if (protocol>=5) ret |= PF1_ADDSEARCHRES;
            break;

        case PFLAGNUM_2:
            ret = PF2_ONLINE | PF2_SHORTAWAY | PF2_INVISIBLE | PF2_HEAVYDND; 
#ifdef MAPDND
	ret |= PF2_LIGHTDND | PF2_HEAVYDND;
#endif		
			if (!DBGetContactSettingByte(NULL, SKYPE_PROTONAME, "NoSkype3Stats", 0))
				ret |= PF2_LONGAWAY | PF2_FREECHAT;
            break;

        case PFLAGNUM_3:
			ret = PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT | PF2_OUTTOLUNCH | PF2_ONTHEPHONE | PF2_IDLE;
            break;
            
        case PFLAGNUM_4:
            ret = PF4_FORCEAUTH | PF4_FORCEADDED | PF4_AVATARS | PF4_SUPPORTTYPING /* Not really, but libgaim compat. */;
			if (mirandaVersion >= 0x070000) ret |= PF4_IMSENDUTF;
            break;
        case PFLAG_UNIQUEIDTEXT:
            ret = (INT_PTR) "NAME";
            break;
        case PFLAG_UNIQUEIDSETTING:
            ret = (INT_PTR) SKYPE_NAME;
            break;
    }
    return ret;
		
}

INT_PTR SkypeGetName(WPARAM wParam, LPARAM lParam)
{
	if (lParam)
	{
		strncpy((char *)lParam, SKYPE_PROTONAME, wParam);
		return 0; // Success
	}
	return 1; // Failure
}


INT_PTR SkypeLoadIcon(WPARAM wParam,LPARAM lParam)
{
	UINT id;

	UNREFERENCED_PARAMETER(lParam);

	switch(wParam&0xFFFF) {
		case PLI_PROTOCOL: id=IDI_SKYPE; break; // IDI_MAIN is the main icon for the protocol
		default: return NULL;	
	}
	return (INT_PTR)LoadImage(hInst,MAKEINTRESOURCE(id),IMAGE_ICON,GetSystemMetrics(wParam&PLIF_SMALL?SM_CXSMICON:SM_CXICON),GetSystemMetrics(wParam&PLIF_SMALL?SM_CYSMICON:SM_CYICON),0);
}

INT_PTR SkypeGetAvatar(WPARAM wParam,LPARAM lParam)
{	DBVARIANT dbv;
	if (!DBGetContactSettingString(NULL,SKYPE_PROTONAME, "AvatarFile", &dbv)){
		lstrcpynA((char*)wParam, dbv.pszVal, (int)lParam);
		DBFreeVariant(&dbv);
	}
	return 0;
}