/*
Copyright (c) 2014-17 Robert Pösel, 2017-25 Miranda NG team
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 version 2
of the License.
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, see .
*/
#include "stdafx.h"
const ttemplate templates[] =
{
	{ LPGEN("Custom"),    "",         "",                        IDI_DUMMY     },
	{ "AIM",              "SN",       LPGEN("Screen name"),      IDI_AIM       },
	{ "Discord",          "id",       LPGEN("Discord ID"),       IDI_DISCORD   },
	{ "EmLAN",            "Nick",     LPGEN("User name"),        IDI_EMLAN     },
	{ "Facebook",         "ID",       LPGEN("Facebook ID"),      IDI_FACEBOOK  },
	{ "GG",               "UIN",      LPGEN("Gadu-Gadu number"), IDI_GG        },
	{ "ICQ",              "aimId",    LPGEN("User ID"),          IDI_ICQ       },
	{ "ICQCorp",          "UIN",      LPGEN("ICQ number"),       IDI_ICQ       },
	{ "IRC",              "Nick",     LPGEN("Nickname"),         IDI_IRC       },
	{ "Jabber",           "jid",      LPGEN("JID"),              IDI_JABBER    },
	{ "MinecraftDynmap",  "Nick",     LPGEN("Visible name"),     IDI_MINECRAFT },
	{ "MRA",              "e-mail",   LPGEN("E-mail address"),   IDI_MRA       },
	{ "MSN",              "wlid",     LPGEN("Live ID"),          IDI_MSN       },
	{ "Omegle",           "nick",     LPGEN("Visible name"),     IDI_OMEGLE    },
	{ "Sametime",         "stid",     LPGEN("ID"),               IDI_SAMETIME  },
	{ "Skype (SkypeKit)", "sid",      LPGEN("Skype name"),       IDI_SKYPE     },
	{ "Skype (Classic)",  "Username", LPGEN("Skype name"),       IDI_SKYPE     },
	{ "Skype (Web)",      "Username", LPGEN("Skype name"),       IDI_SKYPE     },
	{ "Steam",            "SteamID",  LPGEN("Steam ID"),         IDI_STEAM     },
	{ "Telegram",         "id",       LPGEN("Telegram ID"),      IDI_TELEGRAM  },
	{ "Tlen",             "jid",      LPGEN("Tlen login"),       IDI_TLEN      },
	{ "Tox",              "ToxID",    LPGEN("Tox ID"),           IDI_TOX       },
	{ "Twitter",          "Username", LPGEN("Username"),         IDI_TWITTER   },
	{ "VK",               "ID",       LPGEN("VKontakte ID"),     IDI_VK        },
	{ "WhatsApp",         "ID",       LPGEN("WhatsApp ID"),      IDI_WHATSAPP  },
	{ "XFire",            "Username", LPGEN("Username"),         IDI_XFIRE     },
	{ "Yahoo",            "yahoo_id", LPGEN("ID"),               IDI_YAHOO     },
};
void FillTemplateCombo(HWND hwndDlg, int iCtrlId)
{
	for (auto &it : templates) {
		int i = &it - templates;
		SendDlgItemMessageA(hwndDlg, iCtrlId, CB_INSERTSTRING, i, LPARAM(i == 0 ? Translate(it.name) : it.name));
	}
}
void InitIcons()
{
	wchar_t wszDllName[MAX_PATH];
	GetModuleFileNameW(g_plugin.getInst(), wszDllName, _countof(wszDllName));
	SKINICONDESC sid = {};
	sid.flags = SIDF_PATH_UNICODE;
	sid.defaultFile.w = wszDllName;
	sid.section.a = "Protocols/Dummy";
	for (auto &it : templates) {
		sid.iDefaultIndex = -it.iconId;
		sid.pszName = (char *)it.name;
		sid.description.a = (char *)it.name;
		g_plugin.addIcon(&sid);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////
static int sttCompareProtocols(const CDummyProto *p1, const CDummyProto *p2)
{
	return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
}
CDummyProto::CDummyProto(const char *szModuleName, const wchar_t *ptszUserName) :
	PROTO(szModuleName, ptszUserName)
{
	msgid = 0;
	int id = getTemplateId();
	ptrA setting(id > 0 ? mir_strdup(templates[id].setting) : getStringA(DUMMY_ID_SETTING));
	if (setting != NULL) {
		strncpy_s(uniqueIdText, setting, _TRUNCATE);
		Proto_SetUniqueId(m_szModuleName, uniqueIdText);
	}
	else uniqueIdText[0] = '\0';
	uniqueIdSetting[0] = '\0';
	m_hProtoIcon = g_plugin.getIconHandle(templates[id].iconId);
}
CDummyProto::~CDummyProto()
{
}
//////////////////////////////////////////////////////////////////////////////
int CDummyProto::getTemplateId()
{
	int id = getByte(DUMMY_ID_TEMPLATE, -1);
	if (id >= 0 && id < _countof(templates))
		return id;
	
	CMStringA szProto(getMStringA("AM_PrevProto"));
	if (szProto.IsEmpty())
		szProto = getMStringA("AM_BaseProto");
	for (auto &it : templates)
		if (szProto == it.name)
			return int(&it - templates);
	return 0;
}
void CDummyProto::selectTemplate(HWND hwndDlg, int templateId)
{
	// Enable custom fields when selected custom template
	EnableWindow(GetDlgItem(hwndDlg, IDC_ID_TEXT), templateId == 0);
	EnableWindow(GetDlgItem(hwndDlg, IDC_ID_SETTING), templateId == 0);
	ptrA tszIdText(templateId > 0 ? mir_strdup(Translate(templates[templateId].text)) : getStringA(DUMMY_ID_TEXT));
	if (tszIdText != NULL)
		SetDlgItemTextA(hwndDlg, IDC_ID_TEXT, tszIdText);
	ptrA tszIdSetting(templateId > 0 ? mir_strdup(templates[templateId].setting) : getStringA(DUMMY_ID_SETTING));
	if (tszIdSetting != NULL)
		SetDlgItemTextA(hwndDlg, IDC_ID_SETTING, tszIdSetting);
}
INT_PTR CDummyProto::GetCaps(int type, MCONTACT)
{
	switch(type) {
	case PFLAGNUM_1:
		return PF1_IM | PF1_BASICSEARCH | PF1_ADDSEARCHRES;
	case PFLAGNUM_4:
		return PF4_AVATARS | PF4_NOAUTHDENYREASON | PF4_NOCUSTOMAUTH;
	case PFLAG_UNIQUEIDTEXT:
		if (uniqueIdSetting[0] == '\0') {
			int id = getTemplateId();
			ptrW setting(id > 0 ? mir_a2u(Translate(templates[id].text)) : getWStringA(DUMMY_ID_TEXT));
			if (setting != NULL)
				wcsncpy_s(uniqueIdSetting, setting, _TRUNCATE);
		}
		return (INT_PTR)uniqueIdSetting;
	case 1000: // hidden caps
		return TRUE;
	}
	return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
void CDummyProto::SearchIdAckThread(void *targ)
{
	PROTOSEARCHRESULT psr = { 0 };
	psr.cbSize = sizeof(psr);
	psr.flags = PSR_UNICODE;
	psr.id.w = (wchar_t *)targ;
	ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, targ, (LPARAM)&psr);
	ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, targ, 0);
	mir_free(targ);
}
HANDLE CDummyProto::SearchBasic(const wchar_t *id)
{
	if (uniqueIdSetting[0] == '\0')
		return nullptr;
	wchar_t *tid = mir_wstrdup(id);
	ForkThread(&CDummyProto::SearchIdAckThread, tid);
	return tid;
}
//////////////////////////////////////////////////////////////////////////////
int CDummyProto::SendMsg(MCONTACT hContact, MEVENT, const char *msg)
{
	std::string message = msg;
	unsigned int id = InterlockedIncrement(&msgid);
	if (getByte(DUMMY_KEY_ALLOW_SENDING, 0))
		ProtoBroadcastAsync(hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)id);
	else
		ProtoBroadcastAsync(hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)id, (LPARAM)TranslateT("This Dummy account has disabled sending messages. Enable it in account options."));
	return id;
}
int CDummyProto::SetStatus(int)
{
	return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
MCONTACT CDummyProto::AddToList(int flags, PROTOSEARCHRESULT* psr)
{
	if (psr->id.w == nullptr)
		return NULL;
	MCONTACT hContact = db_add_contact();
	Proto_AddToContact(hContact, m_szModuleName);
	if (flags & PALF_TEMPORARY) {
		Contact::Hide(hContact);
		Contact::RemoveFromList(hContact);
	}
	else if (!Contact::OnList(hContact)) {
		Contact::Hide(hContact, false);
		Contact::PutOnList(hContact);
	}
	setWString(hContact, _T2A(uniqueIdSetting), psr->id.w);
	setWString(hContact, "Nick", psr->id.w);
	return hContact;
}