// BKSettPage_2.cpp: файл реализации
//

#include "pch.h"
#include "afxdialogex.h"
#include "BKSettPage_2.h"

#include "Config.h"


Bool_Items BKSettDlg_2::bool_items[bool_size] =
{
	// itemID,							id,										value
	// ИД контрола,						глобальная переменная,					текущее значение
	  { IDC_CHECK_SETT_COLORMODE,		&g_Config.m_bColorMode,					FALSE }
	, { IDC_CHECK_SETT_ADAPTBLKWHT,		&g_Config.m_bAdaptBWMode,				FALSE }
	, { IDC_CHECK_SETT_FULLSCREEN,		&g_Config.m_bFullscreenMode,			FALSE }
	, { IDC_CHECK_SETT_LUMINOFOREMODE,	&g_Config.m_bLuminoforeEmulMode,        FALSE }
	, { IDC_CHECK_SETT_SMOOTHING,		&g_Config.m_bSmoothing,					FALSE }

	, { IDC_CHECK_SETT_EMUSPEAKER,		&g_Config.m_bSpeaker,					FALSE }
	, { IDC_CHECK_SETT_FILTSPEAKER,		&g_Config.m_bSpeakerFilter,				FALSE }
	, { IDC_CHECK_SETT_EMUCOVOX,		&g_Config.m_bCovox,						FALSE }
	, { IDC_CHECK_SETT_FILTCOVOX,		&g_Config.m_bCovoxFilter,				FALSE }
	, { IDC_CHECK_SETT_STEREOCOVOX,		&g_Config.m_bStereoCovox,				FALSE }
	, { IDC_CHECK_SETT_EMUAY,			&g_Config.m_bAY8910,					FALSE }
	, { IDC_CHECK_SETT_FILTAY,			&g_Config.m_bAY8910Filter,				FALSE }

	, { IDC_CHECK_SETT_BKKEYBOARD,		&g_Config.m_bBKKeyboard,				FALSE }
	, { IDC_CHECK_SETT_JOYSTICK,		&g_Config.m_bJoystick,					FALSE }
	, { IDC_CHECK_SETT_EMUMOUSE,		&g_Config.m_bMouseMars,					FALSE }
	, { IDC_CHECK_SETT_ICLBLOCK,		&g_Config.m_bICLBlock,					FALSE }

	, { IDC_CHECK_SETT_EMULOADTAPE,		&g_Config.m_bEmulateLoadTape,			FALSE }
	, { IDC_CHECK_SETT_EMUSAVETAPE,		&g_Config.m_bEmulateSaveTape,			FALSE }
	, { IDC_CHECK_SETT_AUTOBGNTAPE,		&g_Config.m_bTapeAutoBeginDetection,	FALSE }
	, { IDC_CHECK_SETT_AUTOENDTAPE,		&g_Config.m_bTapeAutoEnsDetection,		FALSE }
	, { IDC_CHECK_SETT_EMUFDDIO,		&g_Config.m_bEmulateFDDIO,				FALSE }
	, { IDC_CHECK_SETT_LONGBIN,			&g_Config.m_bUseLongBinFormat,			FALSE }

	, { IDC_CHECK_SETT_PAUSECPU,		&g_Config.m_bPauseCPUAfterStart,        FALSE }
	, { IDC_CHECK_SETT_ASKFORBREAK,		&g_Config.m_bAskForBreak,				FALSE }
	, { IDC_CHECK_SETT_SHOWPERFSTR,		&g_Config.m_bShowPerformance,			FALSE }
	, { IDC_CHECK_SETT_SAVESDEFAULT,	&g_Config.m_bSavesDefault,				FALSE }
};

// Диалоговое окно BKSettDlg_2

IMPLEMENT_DYNAMIC(BKSettDlg_2, CDialogEx)

BKSettDlg_2::BKSettDlg_2(CWnd *pParent /*=nullptr*/)
	: CDialogEx(IDD_SETTINGS_2, pParent)
	, m_nVKBDVw(0)
	, m_nRegDumpIntrv(0)
{}

BKSettDlg_2 ::~BKSettDlg_2()
{}


BEGIN_MESSAGE_MAP(BKSettDlg_2, CDialogEx)
	ON_MESSAGE(WM_SETT_SENDTOTAB, &BKSettDlg_2::OnSendToTab)
	ON_BN_CLICKED(IDC_CHECK_SETT_EMUCOVOX, &BKSettDlg_2::OnBnClickedCheckSettEmucovox)
	ON_BN_CLICKED(IDC_CHECK_SETT_EMUAY, &BKSettDlg_2::OnBnClickedCheckSettEmuay)
	ON_BN_CLICKED(IDC_CHECK_SETT_JOYSTICK, &BKSettDlg_2::OnBnClickedCheckSettJoystick)
	ON_BN_CLICKED(IDC_CHECK_SETT_EMUMOUSE, &BKSettDlg_2::OnBnClickedCheckSettEmumouse)
	ON_BN_CLICKED(IDC_CHECK_SETT_ICLBLOCK, &BKSettDlg_2::OnBnClickedCheckSettIclblock)
END_MESSAGE_MAP()

void BKSettDlg_2::DoDataExchange(CDataExchange *pDX)
{
	CDialogEx::DoDataExchange(pDX);

	DDX_Check(pDX, IDC_CHECK_SETT_COLORMODE, bool_items[0].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_ADAPTBLKWHT, bool_items[1].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_FULLSCREEN, bool_items[2].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_LUMINOFOREMODE, bool_items[3].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_SMOOTHING, bool_items[4].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_EMUSPEAKER, bool_items[5].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_FILTSPEAKER, bool_items[6].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_EMUCOVOX, bool_items[7].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_FILTCOVOX, bool_items[8].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_STEREOCOVOX, bool_items[9].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_EMUAY, bool_items[10].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_FILTAY, bool_items[11].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_BKKEYBOARD, bool_items[12].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_JOYSTICK, bool_items[13].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_EMUMOUSE, bool_items[14].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_ICLBLOCK, bool_items[15].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_EMULOADTAPE, bool_items[16].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_EMUSAVETAPE, bool_items[17].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_AUTOBGNTAPE, bool_items[18].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_AUTOENDTAPE, bool_items[19].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_EMUFDDIO, bool_items[20].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_LONGBIN, bool_items[21].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_PAUSECPU, bool_items[22].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_ASKFORBREAK, bool_items[23].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_SHOWPERFSTR, bool_items[24].bValue);
	DDX_Check(pDX, IDC_CHECK_SETT_SAVESDEFAULT, bool_items[25].bValue);

	DDX_CBIndex(pDX, IDC_COMBO_SETT_VIRTKBDVW, m_nVKBDVw);
	DDX_CBIndex(pDX, IDC_COMBO_SETT_REGSDUMPINT, m_nRegDumpIntrv);
}

static const int RegDumpInt[11] =
{
	0, 1, 2, 3, 4, 5, 10, 15, 20, 25, 50
};

// Обработчики сообщений BKSettDlg_2
BOOL BKSettDlg_2::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	//читаем из конфига значения опций
	for (auto &item : bool_items)
	{
		item.bValue = *item.id;
	}

	auto ctrlVKBDVw = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_VIRTKBDVW));
	CString str;
	str.LoadString(IDS_SETT_KBDVIEW0);
	ctrlVKBDVw->AddString(str);
	str.LoadString(IDS_SETT_KBDVIEW1);
	ctrlVKBDVw->AddString(str);
	m_nVKBDVw = g_Config.m_nVKBDType;

	auto ctrlRegDumpInt = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_REGSDUMPINT));

	for (int i = 0; i < 11; ++i)
	{
		if (RegDumpInt[i] == g_Config.m_nRegistersDumpInterval)
		{
			m_nRegDumpIntrv = i;
		}
		CString str = ::IntToString(RegDumpInt[i]);
		ctrlRegDumpInt->AddString(str);
	}

	UpdateData(FALSE);
	return TRUE;
}

// Тут мы ловим сообщение главного окна, мол "Сохраняйся, сваливаем"
LRESULT BKSettDlg_2::OnSendToTab(WPARAM, LPARAM)
{
	return LRESULT(Save());
}

DWORD BKSettDlg_2::Save()
{
	DWORD nChanges = NO_CHANGES;

	UpdateData(TRUE);

	for (auto &item : bool_items)
	{
		bool b = !!item.bValue;
		if (b != *item.id)
		{
			nChanges |= CHANGES_NOREBOOT;
			*item.id = b;
		}
	}

	if (g_Config.m_nVKBDType != m_nVKBDVw)  // Если что-то поменялось
	{
		nChanges |= CHANGES_NOREBOOT;
		g_Config.m_nVKBDType = m_nVKBDVw;
	}

	if (g_Config.m_nRegistersDumpInterval != RegDumpInt[m_nRegDumpIntrv])
	{
		nChanges |= CHANGES_NOREBOOT;
		g_Config.m_nRegistersDumpInterval = RegDumpInt[m_nRegDumpIntrv];
	}

	return nChanges;
}

void BKSettDlg_2::OnBnClickedCheckSettEmucovox()
{
	UpdateData(TRUE);

	if (bool_items[7].bValue)
	{
		bool_items[10].bValue = false;
	}

	UpdateData(FALSE);
}


void BKSettDlg_2::OnBnClickedCheckSettEmuay()
{
	UpdateData(TRUE);

	if (bool_items[10].bValue)
	{
		bool_items[7].bValue = false;
	}

	UpdateData(FALSE);
}

void BKSettDlg_2::OnBnClickedCheckSettJoystick()
{
	UpdateData(TRUE);

	if (bool_items[13].bValue)
	{
		bool_items[14].bValue = false;
		bool_items[15].bValue = false;
	}

	UpdateData(FALSE);
}


void BKSettDlg_2::OnBnClickedCheckSettEmumouse()
{
	UpdateData(TRUE);

	if (bool_items[14].bValue)
	{
		bool_items[13].bValue = false;
		bool_items[15].bValue = false;
	}

	UpdateData(FALSE);
}


void BKSettDlg_2::OnBnClickedCheckSettIclblock()
{
	UpdateData(TRUE);

	if (bool_items[15].bValue)
	{
		bool_items[13].bValue = false;
		bool_items[14].bValue = false;
	}

	UpdateData(FALSE);
}

void BKSettDlg_2::OnOK()
{
	// блокируем клавишу Enter
}


void BKSettDlg_2::OnCancel()
{
	// блокируем клавишу Esc
}

