#include "StdAfx.h"
#include "BK.h"
#include "BKSettingsDlg.h"
#include "LoadImgDlg.h"
#include <algorithm>

BEGIN_MESSAGE_MAP(CSettingsDlg, CDialogEx)
	ON_BN_CLICKED(ID_SELECT0, &CSettingsDlg::OnBnClickedSelect0)
	ON_BN_CLICKED(ID_SELECT1, &CSettingsDlg::OnBnClickedSelect1)
	ON_BN_CLICKED(ID_SELECT2, &CSettingsDlg::OnBnClickedExchange)
END_MESSAGE_MAP()


CSettingsDlg::CSettingsDlg() : CDialogEx(CSettingsDlg::IDD)
{
}

void CSettingsDlg::DoDataExchange(CDataExchange *pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BOOL CSettingsDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	GetDlgItem(IDC_EMUL_COMPILED)->SetWindowText(theApp.m_strProgramTitleVersion);
	auto ScreenRenderType = static_cast<CComboBox *>(GetDlgItem(IDC_SETT_COMBO1));
	CString str;
	str.LoadString(IDS_RENDER_OGL);
	ScreenRenderType->AddString(str);
	str.LoadString(IDS_RENDER_D2D);
	ScreenRenderType->AddString(str);
	str.LoadString(IDS_RENDER_DIB);
	ScreenRenderType->AddString(str);
	str.LoadString(IDS_RENDER_D3D);
	ScreenRenderType->AddString(str);
	ScreenRenderType->SetCurSel(g_Config.m_nScreenRenderType);
	auto OscRenderType = static_cast<CComboBox *>(GetDlgItem(IDC_SETT_COMBO2));
	str.LoadString(IDS_RENDER_OGL);
	OscRenderType->AddString(str);
	str.LoadString(IDS_RENDER_D2D);
	OscRenderType->AddString(str);
	str.LoadString(IDS_RENDER_GDI);
	OscRenderType->AddString(str);
	OscRenderType->SetCurSel(g_Config.m_nOscRenderType);
	int nNumSSR = 0;

	for (int i = 0; i < 3; ++i) // Переведём значение в номер позиции в выпадашке
	{
		if (g_Config.m_nSoundSampleRate == g_EnabledSSR[i])
		{
			nNumSSR = i;
			break;
		}
	}

	auto SoundSampleRate = static_cast<CComboBox *>(GetDlgItem(IDC_SETT_COMBO3));

	for (int i : g_EnabledSSR)  // Заберём из массива список для выпадашки
	{
		SoundSampleRate->AddString((LPCTSTR)IntToString(i));
	}

	SoundSampleRate->SetCurSel(nNumSSR);
	// Model Board
	register CONFIG_BKMODEL_NUMBER n = g_Config.GetBKModelNumber();
	CString strConfigName = g_mstrConfigBKModelParameters[static_cast<int>(n)].strBKModelName;
	//CString strBoardName = g_Config.m_strBKBoardType;
	GetDlgItem(IDC_SETT_BOARD)->SetWindowText(strConfigName);
	// HDD Images
	CString strHDDImgName = g_Config.GetHDDriveImgName(0);
	GetDlgItem(IDC_SETT_HDD0)->SetWindowText(strHDDImgName);
	m_aHDD[0].Old = strHDDImgName;
	strHDDImgName = g_Config.GetHDDriveImgName(1);
	GetDlgItem(IDC_SETT_HDD1)->SetWindowText(strHDDImgName);
	m_aHDD[1].Old = strHDDImgName;
	return TRUE;
}

void CSettingsDlg::Save()
{
	auto ScreenRenderType = static_cast<CComboBox *>(GetDlgItem(IDC_SETT_COMBO1));

	if (g_Config.m_nScreenRenderType != ScreenRenderType->GetCurSel())  // Если что-то поменялось
	{
		g_Config.m_nScreenRenderType = ScreenRenderType->GetCurSel();
	}

	auto OscRenderType = static_cast<CComboBox *>(GetDlgItem(IDC_SETT_COMBO2));

	if (g_Config.m_nOscRenderType != OscRenderType->GetCurSel())        // Если что-то поменялось
	{
		g_Config.m_nOscRenderType = OscRenderType->GetCurSel();
	}

	// Для Аудио немного посложнее, но мы справимся
	auto SoundSampleRate = static_cast<CComboBox *>(GetDlgItem(IDC_SETT_COMBO3));

	if (g_Config.m_nSoundSampleRate != g_EnabledSSR[SoundSampleRate->GetCurSel()])  // Если что-то поменялось
	{
		g_Config.m_nSoundSampleRate = g_EnabledSSR[SoundSampleRate->GetCurSel()];
	}

	// TODO: Сохраним остальные исправленные или нет параметры
	CString h0, h1;

	if (m_aHDD[0].Ex == 1)  // Обмен
	{
		h0 = (m_aHDD[0].New != g_strEmptyUnit) ? m_aHDD[0].New : m_aHDD[0].Old;
	}
	else if (m_aHDD[0].Ex == 2)     // заменили файл
	{
		h0 = m_aHDD[0].New;
	}

	if (m_aHDD[0].Ex > 0 /* && h0 != g_HDD[0].Old*/)
	{
		g_Config.SetHDDriveImgName(0, h0);
	}

	if (m_aHDD[1].Ex == 1)  // Обмен
	{
		h1 = (m_aHDD[1].New != g_strEmptyUnit) ? m_aHDD[1].New : m_aHDD[1].Old;
	}
	else if (m_aHDD[1].Ex == 2)     // заменили файл
	{
		h1 = m_aHDD[1].New;
	}

	if (m_aHDD[1].Ex > 0 /* && h1 != g_HDD[1].Old*/)
	{
		g_Config.SetHDDriveImgName(1, h1);
	}

	m_aHDD[0].Ex = 0;
	m_aHDD[1].Ex = 0;
}

void CSettingsDlg::OnBnClickedSelect1()
{
	LoadHDDFileImage(1);
}

void CSettingsDlg::OnBnClickedSelect0()
{
	LoadHDDFileImage(0);
}

void CSettingsDlg::LoadHDDFileImage(int nDrive)
{
	nDrive &= 1;
	CString strFilterIMG;
	strFilterIMG.LoadString(IDS_FILEFILTER_BKHDDIMG);
	//диалог предназначен для загрузки образов дискет.
	//TODO: допилить, чтобы ещё и образы винтов понимал.
	CLoadImgDlg dlg(true, nullptr, nullptr,
	                OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR | OFN_EXPLORER,
	                strFilterIMG, nullptr);
	dlg.GetOFN().lpstrInitialDir = g_Config.m_strIMGPath; // диалог всегда будем начинать с домашней директории образов.

	if (dlg.DoModal() == IDOK)
	{
		CString str = dlg.GetPathName();
		GetDlgItem(nDrive == 0 ? IDC_SETT_HDD0 : IDC_SETT_HDD1)->SetWindowText(str);
		m_aHDD[nDrive].New = str;
		m_aHDD[nDrive].Ex = 2;
	}
}

void CSettingsDlg::OnBnClickedExchange()
{
	std::swap(m_aHDD[0], m_aHDD[1]);
	m_aHDD[0].Ex = m_aHDD[1].Ex = 1;
	CString strHDD = (m_aHDD[0].New == g_strEmptyUnit) ? m_aHDD[0].Old : m_aHDD[0].New;
	GetDlgItem(IDC_SETT_HDD0)->SetWindowText(strHDD);
	strHDD = (m_aHDD[1].New == g_strEmptyUnit) ? m_aHDD[1].Old : m_aHDD[1].New;
	GetDlgItem(IDC_SETT_HDD1)->SetWindowText(strHDD);
}


void CSettingsDlg::OnOK()
{
	Save();
	CDialogEx::OnOK();
}

