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

#include "pch.h"
#include "afxdialogex.h"
#include "BKSettPage_3.h"

#include "Config.h"


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

IMPLEMENT_DYNAMIC(BKSettDlg_3, CDialogEx)

BKSettDlg_3::BKSettDlg_3(CWnd *pParent /*=nullptr*/)
	: CDialogEx(IDD_SETTINGS_3, pParent)
	, m_bOrigScreenshotsSize(FALSE)
	, m_bOrigButtonsSize(FALSE)
	, m_nOrigScreenshotNumber(0)
	, m_strOrigFFMPEGLine(_T(""))
	, m_nOrigSSR(0)
	, m_nOrigSndChip(0)
	, m_nOrigSndChip2(0)
	, m_nOrigScrRender(0)
	, m_nOrigOscRender(0)
	, m_strOrigSndChipFreq(_T(""))
{}

BKSettDlg_3 ::~BKSettDlg_3()
{}


BEGIN_MESSAGE_MAP(BKSettDlg_3, CDialogEx)
	ON_BN_CLICKED(ID_BUTTON_SETT_FFMPEG_DEFAULT, &BKSettDlg_3::OnBnClickedButtonFfmpegDefault)
	ON_MESSAGE(WM_SETT_SENDTOTAB, &BKSettDlg_3::OnSendToTab)
END_MESSAGE_MAP()

void BKSettDlg_3::DoDataExchange(CDataExchange *pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Check(pDX, IDC_CHECK_SETT_ORIGINSCREENSIZE, m_bOrigScreenshotsSize);
	DDX_Check(pDX, IDC_CHECK_SETT_BIGBUTTONS, m_bOrigButtonsSize);
	DDX_Text(pDX, IDC_EDIT_SETT_SCREENSHOTNUMBER, m_nOrigScreenshotNumber);
	DDX_Text(pDX, IDC_EDIT_SETT_FFMPEG, m_strOrigFFMPEGLine);
	DDX_CBIndex(pDX, IDC_COMBO_SETT_SOUNDSR, m_nOrigSSR);
	DDX_CBIndex(pDX, IDC_COMBO_SETT_SNDCHIPMODEL, m_nOrigSndChip);
	DDX_CBIndex(pDX, IDC_COMBO_SETT_SNDCHIPMODEL2, m_nOrigSndChip2);
	DDX_CBIndex(pDX, IDC_COMBO_SETT_SCRRENDER, m_nOrigScrRender);
	DDX_CBIndex(pDX, IDC_COMBO_SETT_OSCRENDER, m_nOrigOscRender);
	DDX_CBString(pDX, IDC_COMBO_SETT_SNDCHIPFREQ, m_strOrigSndChipFreq);
}

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

	auto ScreenRenderType = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_SCRRENDER));
	str.LoadString(IDS_RENDER_OGL);
	ScreenRenderType->AddString(str.GetString());
	str.LoadString(IDS_RENDER_D2D);
	ScreenRenderType->AddString(str.GetString());
	str.LoadString(IDS_RENDER_DIB);
	ScreenRenderType->AddString(str.GetString());
	str.LoadString(IDS_RENDER_D3D);
	ScreenRenderType->AddString(str.GetString());
	m_nOrigScrRender = static_cast<int>(g_Config.m_nScreenRenderType);

	auto OscRenderType = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_OSCRENDER));
	str.LoadString(IDS_RENDER_OGL);
	OscRenderType->AddString(str.GetString());
	str.LoadString(IDS_RENDER_D2D);
	OscRenderType->AddString(str.GetString());
	str.LoadString(IDS_RENDER_GDI);
	OscRenderType->AddString(str.GetString());
	m_nOrigOscRender = static_cast<int>(g_Config.m_nOscRenderType);

	auto SoundSampleRate = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_SOUNDSR));
	int nPos = 0;

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

		if (g_Config.m_nSoundSampleRate == i) // Переведём значение в номер позиции в выпадашке
		{
			m_nOrigSSR = nPos;
		}

		nPos++;
	}

	auto SoundChipModel = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_SNDCHIPMODEL));
	nPos = 0;

	for (const auto &m : g_EnabledSoundChipModels)
	{
		CString str;
		str.LoadString(m.nIDstrModel);
		SoundChipModel->AddString(str);

		if (g_Config.m_nSoundChipModel == m.nModelNum) // Переведём значение в номер позиции в выпадашке
		{
			m_nOrigSndChip = nPos;
		}

		nPos++;
	}

	// Второй ЧИП сопроцессора
	auto SoundChipModel2 = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_SNDCHIPMODEL2));
	nPos = 0;

	for (const auto &m : g_EnabledSoundChipModels)
	{
		CString str;
		str.LoadString(m.nIDstrModel);
		SoundChipModel2->AddString(str);

		if (g_Config.m_nSoundChipModel == m.nModelNum) // [TODO:] В конфигурации ещё нет модели 2 сопроцессора!
		{
			m_nOrigSndChip2 = nPos;
		}

		nPos++;
	}

	// Частота сопроцессора/ов
	auto SoundChipFreq = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO_SETT_SNDCHIPFREQ));
	bool bInList = false;
	for (const auto &f : g_SoundChipFrequences)
	{
		CString str;
		str.LoadString(f.nIDstrFreq);
		SoundChipFreq->AddString(str);

		if (g_Config.m_nSoundChipFrequency == f.nFreq) // Переведём значение в номер позиции в выпадашке
		{
			m_strOrigSndChipFreq = str;
			bInList = true;
		}
	}

	if (!bInList)
	{
		m_strOrigSndChipFreq = ::IntToString(g_Config.m_nSoundChipFrequency);
	}

	// Screenshots sizes
	m_bOrigScreenshotsSize = g_Config.m_bOrigScreenshotSize;
	// Screenshots number
	m_nOrigScreenshotNumber = g_Config.m_nScreenshotNumber;
	// Big buttons for Instrumental Panel
	m_bOrigButtonsSize = g_Config.m_bBigButtons;
	// FFMPEG Line
	m_strOrigFFMPEGLine = g_Config.m_strFFMPEGLine;
	// Check FFMPEG
	bool m_bFoundFFMPEG = ::CheckFFMPEG();
	GetDlgItem(IDC_EDIT_SETT_FFMPEG)->EnableWindow(m_bFoundFFMPEG ? TRUE : FALSE);
	UpdateData(FALSE);
	return TRUE;
}


LRESULT BKSettDlg_3::OnSendToTab(WPARAM, LPARAM)
{
	return LRESULT(Save());
}

DWORD BKSettDlg_3::Save()
{
	DWORD nChanges = NO_CHANGES;
	UpdateData(TRUE);

	//получим новый тип рендера экрана
	auto nNewRender = static_cast<CONF_SCREEN_RENDER>(m_nOrigScrRender);
	if (g_Config.m_nScreenRenderType != nNewRender)  // Если что-то поменялось
	{
		nChanges |= CHANGES_NEEDREBOOT;
		g_Config.m_nScreenRenderType = nNewRender;
	}

	//получим новый тип рендера осциллографа
	auto nNewOSC = static_cast<CONF_OSCILLOSCOPE_RENDER>(m_nOrigOscRender);

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

	g_Config.CheckRenders(); // нужно, т.к. есть зависимость от ОС, в которой работает эмулятор

	//получим новую частоту дискретизации звука
	if (g_Config.m_nSoundSampleRate != g_EnabledSSR[m_nOrigSSR])  // Если что-то поменялось
	{
		nChanges |= CHANGES_NEEDREBOOT;
		g_Config.m_nSoundSampleRate = g_EnabledSSR[m_nOrigSSR];
	}

	//получим новую модель сопра #1
	if (g_Config.m_nSoundChipModel != g_EnabledSoundChipModels[m_nOrigSndChip].nModelNum)  // Если что-то поменялось
	{
		nChanges |= CHANGES_NEEDREBOOT;
		g_Config.m_nSoundChipModel = g_EnabledSoundChipModels[m_nOrigSndChip].nModelNum;
	}

	//получим новую модель сопра #2
	//
	// Т.к. первый чип забирает данные с верхних 15 регистров: 377-360, второй забирает 347-330. Средние 350-357 остаются для управления этими двумя чипами
	// и всякой фигнёй, предложенные самоделкиными из группы в "телеграм"
	//
// 	if (g_Config.m_nSoundChipModel != g_EnabledSoundChipModels[m_nOrigSndChip2].nModelNum)  // [TODO:] В конфигурации ещё нет модели 2 сопроцессора!
// 	{
// 		bChanges |= CHANGES_NEEDREBOOT;
// 		g_Config.m_nSoundChipModel = g_EnabledSoundChipModels[m_nOrigSndChip2].nModelNum;
// 	}

	//получим новую частоту его работы
	int freq = _tcstoul(m_strOrigSndChipFreq, nullptr, 10);
	if (g_Config.m_nSoundChipFrequency != freq)  // Если что-то поменялось
	{
		nChanges |= CHANGES_NEEDREBOOT;
		g_Config.m_nSoundChipFrequency = freq;
	}
	g_Config.CheckSndChipFreq();

	// Save Screenshots sizes
	if (!!m_bOrigScreenshotsSize != g_Config.m_bOrigScreenshotSize)
	{
		nChanges |= CHANGES_NOREBOOT;
		g_Config.m_bOrigScreenshotSize = !!m_bOrigScreenshotsSize;
	}

	// Save Big buttons for Instrumental Panel
	if (!!m_bOrigButtonsSize != g_Config.m_bBigButtons)
	{
		nChanges |= CHANGES_NOREBOOT;
		g_Config.m_bBigButtons = !!m_bOrigButtonsSize;
	}

	// Save Screenshots number
	if (m_nOrigScreenshotNumber != g_Config.m_nScreenshotNumber)
	{
		nChanges |= CHANGES_NOREBOOT;
		g_Config.m_nScreenshotNumber = m_nOrigScreenshotNumber;
	}

	// Save FFMPEG Line
	if (m_strOrigFFMPEGLine != g_Config.m_strFFMPEGLine)
	{
		nChanges |= CHANGES_NOREBOOT;
		g_Config.m_strFFMPEGLine = m_strOrigFFMPEGLine;
	}

	return nChanges;
}

void BKSettDlg_3::OnBnClickedButtonFfmpegDefault()
{
	GetDlgItem(IDC_EDIT_SETT_FFMPEG)->SetWindowText(DEFAULT_FFMPEG_CMDLINE);
}



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


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

