#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 "Screen_Sizes.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)
{
}

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();
	SetDlgItemText(IDC_STATIC_EMULCOMPILED, theApp.m_strCompileVersion);
	m_nTabCount = 0;
	// Паги вкладок START
	// С первой паги. Можно будет оптимизировать в массив наверное
	auto pPage1 = new BKSettDlg_1;
	AddTab(m_nTabCount++, pPage1, BKSettDlg_1::IDD, IDS_SETT_TABTITLE0, true);
	auto pPage3 = new BKSettDlg_3;
	AddTab(m_nTabCount++, pPage3, BKSettDlg_3::IDD, IDS_SETT_TABTITLE1);
	auto pPage2 = new BKSettDlg_2;
	AddTab(m_nTabCount++, pPage2, BKSettDlg_2::IDD, IDS_SETT_TABTITLE2);
	m_ctrTab.SetCurSel(0);               // Отметимся на стартовой паге
	CenterWindow(GetParent());
	//  Паги вкладок END
	return TRUE;
}

void CSettingsDlg::AddTab(int nTabNum, CDialogEx *pDlg, UINT nDlgID, UINT nTitleID, bool bShow)
{
	int nPixelW = ::GetDeviceCaps(GetDC()->GetSafeHdc(), LOGPIXELSX);
	int nPixelH = ::GetDeviceCaps(GetDC()->GetSafeHdc(), LOGPIXELSY);
	CString strTitle = CString(MAKEINTRESOURCE(nTitleID));
	TCITEM tcItem;
	ZeroMemory(&tcItem, sizeof(TCITEM));
	tcItem.mask = TCIF_TEXT | TCIF_PARAM;
	tcItem.lParam = reinterpret_cast<LPARAM>(pDlg);
	tcItem.pszText = strTitle.GetBuffer();
	//tcItem.iImage = -1;
	m_ctrTab.InsertItem(nTabNum, &tcItem);
	VERIFY(pDlg->Create(nDlgID, &m_ctrTab));
	pDlg->SetWindowPos(nullptr, ::MulDiv(2, nPixelW, DEFAULT_DPIX), ::MulDiv(22, nPixelH, DEFAULT_DPIY), 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	pDlg->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
}




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

	return nullptr;
}

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

	for (int i = 0; i < m_nTabCount; ++i)
	{
		m_ctrTab.GetItem(i, &tcItem);

		if (tcItem.lParam)
		{
			auto pWnd = reinterpret_cast<CDialogEx *>(tcItem.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 tcItem;
	ZeroMemory(&tcItem, sizeof(TCITEM));
	tcItem.mask = TCIF_PARAM;

	for (int i = 0; i < m_nTabCount; i++)
	{
		m_ctrTab.GetItem(i, &tcItem);

		if (tcItem.lParam)
		{
			auto pWnd = reinterpret_cast<CDialogEx *>(tcItem.lParam);
			pWnd->DestroyWindow();
			delete pWnd;
			tcItem.lParam = 0;
		}
	}

	m_nTabCount = 0;
}

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

