#include "stdafx.h"

const wchar_t pluginDescription[] = LPGENW("No more spam! Robots can't go! Only human beings invited!\r\n\r\nThis plugin works pretty simple:\r\nWhile messages from users on your contact list go as there is no any anti-spam software, messages from unknown users are not delivered to you. But also they are not ignored, this plugin replies with a simple question, and if user gives the right answer, plugin adds him to your contact list so that he can contact you.");

class COptMainDlg : public CDlgBase
{
	CCtrlEdit edtCount, edtDescr;
	CCtrlCheck chk1, chk2, chk3, chk4, chk5, chk6;

public:
	COptMainDlg() :
		CDlgBase(g_plugin, IDD_MAIN),
		edtCount(this, ID_MAXQUESTCOUNT),
		edtDescr(this, ID_DESCRIPTION),
		chk1(this, ID_INFTALKPROT),
		chk2(this, ID_ADDPERMANENT),
		chk3(this, ID_HANDLEAUTHREQ),
		chk4(this, ID_NOTCASESENS),
		chk5(this, ID_REMOVE_TMP_ALL),
		chk6(this, ID_HISTORY_LOG)
	{
		CreateLink(edtCount, g_sets.MaxQuestCount);

		CreateLink(chk1, g_sets.InfTalkProtection);
		CreateLink(chk2, g_sets.AddPermanent);
		CreateLink(chk3, g_sets.HandleAuthReq);
		CreateLink(chk4, g_sets.AnswNotCaseSens);
		CreateLink(chk5, g_sets.RemTmpAll);
		CreateLink(chk6, g_sets.HistLog);
	}

	bool OnInitDialog() override
	{
		edtDescr.SetText(TranslateW(pluginDescription));
		return true;
	}
};

/////////////////////////////////////////////////////////////////////////////////////////

class COptMessageDlg : public CDlgBase
{
	CCtrlButton btnHelp, btnRestore;
	CCtrlEdit edtQuestion, edtAnswer, edtCongrat, edtReply, edtDivider;

public:
	COptMessageDlg() :
		CDlgBase(g_plugin, IDD_MESSAGES),
		btnHelp(this, IDC_VARS),
		btnRestore(this, ID_RESTOREDEFAULTS),
		edtQuestion(this, ID_QUESTION),
		edtAnswer(this, ID_ANSWER),
		edtCongrat(this, ID_CONGRATULATION),
		edtReply(this, ID_AUTHREPL),
		edtDivider(this, ID_DIVIDER)
	{
		btnHelp.OnClick = Callback(this, &COptMessageDlg::onHelp);
		btnRestore.OnClick = Callback(this, &COptMessageDlg::onRestore);

		CreateLink(edtReply, g_sets.AuthRepl);
		CreateLink(edtAnswer, g_sets.Answer);
		CreateLink(edtQuestion, g_sets.Question);
		CreateLink(edtCongrat, g_sets.Congratulation);
		CreateLink(edtDivider, g_sets.AnswSplitString);
	}

	bool OnInitDialog() override
	{
		variables_skin_helpbutton(m_hwnd, IDC_VARS);
		btnHelp.Enable(ServiceExists(MS_VARS_FORMATSTRING));

		edtQuestion.SetText(g_sets.getQuestion());
		edtCongrat.SetText(g_sets.getCongrats());
		edtReply.SetText(g_sets.getReply());
		return true;
	}

	void onHelp(CCtrlButton*)
	{
		variables_showhelp(m_hwnd, WM_COMMAND, VHF_FULLDLG | VHF_SETLASTSUBJECT, nullptr, nullptr);
	}

	void onRestore(CCtrlButton*)
	{
		g_plugin.delSetting(g_sets.AuthRepl.GetDBSettingName());
		g_plugin.delSetting(g_sets.Question.GetDBSettingName());
		g_plugin.delSetting(g_sets.Congratulation.GetDBSettingName());

		edtQuestion.SetText(g_sets.getQuestion());
		edtAnswer.SetText(g_sets.Answer.Default());
		edtCongrat.SetText(g_sets.getCongrats());
		edtReply.SetText(g_sets.getReply());
		edtDivider.SetText(g_sets.AnswSplitString.Default());
		
		NotifyChange();
	}
};

/////////////////////////////////////////////////////////////////////////////////////////

class COptAccountDlg : public CDlgBase
{
	CCtrlListView m_accounts;

public:
	COptAccountDlg() :
		CDlgBase(g_plugin, IDD_PROTO),
		m_accounts(this, IDC_PROTO)
	{
		m_accounts.OnItemChanged = Callback(this, &COptAccountDlg::list_OnItemChanged);
	}

	bool OnInitDialog() override
	{
		m_accounts.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);
		m_accounts.DeleteAllItems();

		LVCOLUMN lvc = {};
		lvc.mask = LVCF_WIDTH;
		lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT;
		lvc.cx = 250;
		m_accounts.InsertColumn(0, &lvc);

		LVITEM item = { 0 };
		item.mask = LVIF_TEXT | LVIF_PARAM;
		item.iItem = 1000;

		for (auto &pa : Accounts()) {
			if (!pa->IsEnabled() || pa->bIsVirtual)
				continue;

			item.lParam = (LPARAM)pa->szModuleName;
			item.pszText = pa->tszAccountName;
			int idx = m_accounts.InsertItem(&item);
			m_accounts.SetCheckState(idx, g_sets.ProtoDisabled(pa->szModuleName));
		}
		return true;
	}

	bool OnApply() override
	{
		std::ostringstream out;

		LVITEM item;
		item.mask = LVIF_PARAM;

		for (int i = 0; i < m_accounts.GetItemCount(); i++) {
			item.iItem = i;
			if (!m_accounts.GetItem(&item))
				continue;

			if (m_accounts.GetCheckState(i) != 0)
				out << (char*)item.lParam << " ";
		}

		g_sets.DisabledProtoList = (char*)out.str().c_str();
		return true;
	}

	void list_OnItemChanged(CCtrlListView::TEventInfo*)
	{
		if (m_initialized)
			NotifyChange();
	}
};

/////////////////////////////////////////////////////////////////////////////////////////
// options initializer

int OnOptInit(WPARAM w, LPARAM)
{
	OPTIONSDIALOGPAGE odp = {};
	odp.szGroup.a = LPGEN("Message sessions");
	odp.szTitle.a = MODULENAME;

	odp.szTab.a = LPGEN("General");
	odp.pDialog = new COptMainDlg();
	g_plugin.addOptions(w, &odp);

	odp.szTab.a = LPGEN("Messages");
	odp.pDialog = new COptMessageDlg();
	g_plugin.addOptions(w, &odp);

	odp.szTab.a = LPGEN("Accounts");
	odp.pDialog = new COptAccountDlg();
	g_plugin.addOptions(w, &odp);
	return 0;
}