#include "pch.h"

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes
#include <afxdtctl.h>       // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>         // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#include "BKSettingsDlg.h"
#include "BK.h"
#include "Config.h"

#include "BKSettPage_1.h"
#include "BKSettPage_2.h"
#include "BKSettPage_3.h"

IMPLEMENT_DYNAMIC(CSettingsDlg, CDialogEx)

CSettingsDlg::CSettingsDlg()
	: CDialogEx(CSettingsDlg::IDD)
	, m_nTabCount(0)
	, m_nTabDialog(0)
{
}

BEGIN_MESSAGE_MAP(CSettingsDlg, CDialogEx)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_SETT, &CSettingsDlg::OnSelchangeTab)
	ON_NOTIFY(TCN_SELCHANGING, IDC_TAB_SETT, &CSettingsDlg::OnSelchangingTab)
	ON_WM_DESTROY()
END_MESSAGE_MAP()


void CSettingsDlg::DoDataExchange(CDataExchange *pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TAB_SETT, m_ctrTab);       // Кажется верно обявил...
}

BOOL CSettingsDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	GetDlgItem(IDC_STATIC_EMULCOMPILED)->SetWindowText(theApp.m_strCompileVersion);
	m_nTabCount = 0;
	// Паги вкладок START
	TCITEM tcItem;                                  // Выкрутим ему крутилки на минимум
	ZeroMemory(&tcItem, sizeof(TCITEM));
	tcItem.mask = TCIF_TEXT | TCIF_PARAM;
	tcItem.iImage = -1;
	// С первой паги. Можно будет оптимизировать в массив наверное
	CString str;
	auto pPage1 = new BKSettDlg_1;
	tcItem.lParam = reinterpret_cast<LPARAM>(pPage1);
	str.LoadString(IDS_SETT_TABTITLE0);
	tcItem.pszText = str.GetBuffer();
	m_ctrTab.InsertItem(m_nTabCount, &tcItem);
	m_ctrTab.SetItem(m_nTabCount++, &tcItem);
	VERIFY(pPage1->Create(BKSettDlg_1::IDD, &m_ctrTab));
	pPage1->SetWindowPos(nullptr, 2, 22, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	pPage1->ShowWindow(SW_SHOW);

	auto pPage3 = new BKSettDlg_3;
	tcItem.lParam = reinterpret_cast<LPARAM>(pPage3);
	str.LoadString(IDS_SETT_TABTITLE1);
	tcItem.pszText = str.GetBuffer();
	m_ctrTab.InsertItem(m_nTabCount, &tcItem);
	m_ctrTab.SetItem(m_nTabCount++, &tcItem);
	VERIFY(pPage3->Create(BKSettDlg_3::IDD, &m_ctrTab));
	pPage3->SetWindowPos(nullptr, 2, 22, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	pPage3->ShowWindow(SW_HIDE);

	auto pPage2 = new BKSettDlg_2;
	tcItem.lParam = reinterpret_cast<LPARAM>(pPage2);
	str.LoadString(IDS_SETT_TABTITLE2);
	tcItem.pszText = str.GetBuffer();
	m_ctrTab.InsertItem(m_nTabCount, &tcItem);
	m_ctrTab.SetItem(m_nTabCount++, &tcItem);
	VERIFY(pPage2->Create(BKSettDlg_2::IDD, &m_ctrTab));
	pPage2->SetWindowPos(nullptr, 2, 22, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	pPage2->ShowWindow(SW_HIDE);

	m_ctrTab.SetCurSel(m_nTabDialog);               // Отметимся на стартовой паге
	CenterWindow(GetParent());
	//  Паги вкладок END

	return TRUE;
}

CWnd* CSettingsDlg::GetTabWndPtr(int nTab)
{
	if (nTab < m_nTabCount)
	{
		TCITEM tci;
		ZeroMemory(&tci, sizeof(TCITEM));
		tci.mask = TCIF_PARAM;
		m_ctrTab.GetItem(nTab, &tci);
		ASSERT(tci.lParam);
		return reinterpret_cast<CWnd*>(tci.lParam);
	}
	return nullptr;
}

// выход: true - нужен рестарт
//		false - не нужен рестарт
DWORD CSettingsDlg::Save()
{
	// Сохраним все что менялось во вкладках (в диалогах вкладок)
	TCITEM tci;
	ZeroMemory(&tci, sizeof(TCITEM));
	tci.mask = TCIF_PARAM;

	DWORD nResult = NO_CHANGES;
	for (int i = 0; i < m_nTabCount; ++i)
	{
		m_ctrTab.GetItem(i, &tci);
		if (tci.lParam)
		{
			auto pWnd = reinterpret_cast<CWnd*>(tci.lParam);
			nResult |= DWORD(pWnd->SendMessage(WM_SETT_SENDTOTAB));
			// если во вкладке что-то поменялось, которое требует перезапуска эмулятора,
			// то будет установлен флаг CHANGES_NEEDREBOOT, если поменялась опция, которая не требует перезапуска,
			// то будет установлен флаг CHANGES_NOREBOOT
		}
	}

	return nResult;
}

void CSettingsDlg::OnCancel()
{
	ReleaseTabs();
	CDialogEx::OnCancel();
}

void CSettingsDlg::OnOK()
{
	DWORD nRes = Save(); // Сохраним
	ReleaseTabs();
	if (nRes & CHANGES_NEEDREBOOT)
	{
		CDialogEx::EndDialog(CHANGES_NEEDREBOOT);
	}
	else if (nRes & CHANGES_NOREBOOT)
	{
		CDialogEx::EndDialog(CHANGES_NOREBOOT);
	}
	else
	{
		// если изменений не было, или они не требуют перезапуска, то 
		// возвращается IDCANCEL, чтобы не делать перезапуск эмулятора
		CDialogEx::EndDialog(NO_CHANGES);
	}
}

void CSettingsDlg::OnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult)
{
	int nTab = m_ctrTab.GetCurSel();
	auto pWnd = GetTabWndPtr(nTab);
	pWnd->ShowWindow(SW_SHOW);
	*pResult = 0;
}

void CSettingsDlg::OnSelchangingTab(NMHDR *pNMHDR, LRESULT *pResult)
{
	int nTab = m_ctrTab.GetCurSel();
	auto pWnd = GetTabWndPtr(nTab);
	pWnd->ShowWindow(SW_HIDE);
	*pResult = 0;
}

void CSettingsDlg::ReleaseTabs()
{
	TCITEM tci;
	ZeroMemory(&tci, sizeof(TCITEM));
	tci.mask = TCIF_PARAM;

	for (int i = 0; i < m_nTabCount; i++)
	{
		m_ctrTab.GetItem(i, &tci);
		if (tci.lParam)
		{
			auto pWnd = reinterpret_cast<CWnd*>(tci.lParam);
			pWnd->DestroyWindow();
			delete pWnd;
			tci.lParam = 0;
		}
	}
	m_nTabCount = 0;
}

void CSettingsDlg::OnDestroy()
{
	CDialog::OnDestroy();
	ReleaseTabs();
}

