#include "MainDlg.h"

#include "AboutDlg.h"
#include "config.h"
#include "res/resource.h"

#include <mxdirectx/legodxinfo.h>

DECOMP_SIZE_ASSERT(CDialog, 0x60)
DECOMP_SIZE_ASSERT(CMainDialog, 0x70)

// FUNCTION: CONFIG 0x00403d50
CMainDialog::CMainDialog(CWnd* pParent) : CDialog(IDD, pParent)
{
	afxCurrentWinApp;
	m_icon = LoadIconA(AfxFindResourceHandle(MAKEINTRESOURCE(IDI_CONFIG), RT_GROUP_ICON), MAKEINTRESOURCE(IDI_CONFIG));
}

// FUNCTION: CONFIG 0x00403e50
void CMainDialog::DoDataExchange(CDataExchange* pDX)
{
}

BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(IDC_CHK_FLIP_VIDEO_MEM_PAGES, OnCheckboxFlipVideoMemPages)
ON_LBN_SELCHANGE(IDC_LIST_3DDEVICES, OnList3DevicesSelectionChanged)
ON_COMMAND(IDC_RAD_PALETTE_16BIT, OnRadiobuttonPalette16bit)
ON_COMMAND(IDC_RAD_PALETTE_256, OnRadiobuttonPalette256)
ON_COMMAND(IDC_CHK_3D_VIDEO_MEMORY, OnCheckbox3DVideoMemory)
ON_WM_DESTROY() // FIXME: CONFIG.EXE calls Default
ON_COMMAND(IDABORT, OnButtonCancel)
ON_COMMAND(IDC_CHK_3DSOUND, OnCheckbox3DSound)
ON_COMMAND(IDC_RAD_MODEL_QUALITY_LOW, OnRadiobuttonModelLowQuality)
ON_COMMAND(IDC_RAD_MODEL_QUALITY_HIGH, OnRadiobuttonModelHighQuality)
ON_COMMAND(IDC_RAD_TEXTURE_QUALITY_LOW, OnRadiobuttonTextureLowQuality)
ON_COMMAND(IDC_RAD_TEXTURE_QUALITY_HIGH, OnRadiobuttonTextureHighQuality)
ON_COMMAND(IDC_CHK_JOYSTICK, OnCheckboxJoystick)
ON_COMMAND(IDC_BTN_ADVANCED, OnButtonAdvanced)
ON_COMMAND(IDC_CHK_DRAW_CURSOR, OnCheckboxDrawCursor)
ON_COMMAND(IDC_CHK_MUSIC, OnCheckboxMusic)
END_MESSAGE_MAP()

// FUNCTION: CONFIG 0x00403e80
BOOL CMainDialog::OnInitDialog()
{
	CDialog::OnInitDialog();
	SwitchToAdvanced(FALSE);
	CMenu* system_menu = CMenu::FromHandle(::GetSystemMenu(m_hWnd, FALSE));
	CString about_text;
	about_text.LoadString(IDS_ABOUT);
	if (system_menu) {
		AppendMenuA(system_menu->m_hMenu, MF_SEPARATOR, 0, NULL);
		AppendMenuA(system_menu->m_hMenu, MF_STRING, 16, (LPCTSTR) about_text);
	}
	SendMessage(WM_SETICON, ICON_BIG, (LPARAM) m_icon);
	SendMessage(WM_SETICON, ICON_SMALL, (LPARAM) m_icon);
	LegoDeviceEnumerate* enumerator = currentConfigApp->m_device_enumerator;
	enumerator->FUN_1009d210();
	m_modified = currentConfigApp->ReadRegisterSettings();
	CWnd* list_3d_devices = GetDlgItem(IDC_LIST_3DDEVICES);
	int driver_i = 0;
	int device_i = 0;
	int selected = 0;
	char device_name[256];
	const list<MxDriver>& driver_list = enumerator->GetDriverList();
	for (list<MxDriver>::const_iterator it_driver = driver_list.begin(); it_driver != driver_list.end(); it_driver++) {
		const MxDriver& driver = *it_driver;
		for (list<Direct3DDeviceInfo>::const_iterator it_device = driver.m_devices.begin();
			 it_device != driver.m_devices.end();
			 it_device++) {
			const Direct3DDeviceInfo& device = *it_device;
			if (&device == currentConfigApp->m_device) {
				selected = device_i;
			}
			device_i += 1;
			sprintf(
				device_name,
				driver_i == 0 ? "%s ( Primary Device )" : "%s ( Secondary Device )",
				device.m_deviceName
			);
			::SendMessage(list_3d_devices->m_hWnd, LB_ADDSTRING, 0, (LPARAM) device_name);
		}
		driver_i += 1;
	}
	::SendMessage(list_3d_devices->m_hWnd, LB_SETCURSEL, selected, 0);
	UpdateInterface();
	return TRUE;
}

// FUNCTION: CONFIG 0x00404080
void CMainDialog::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xfff0) == 0x10) {
		CAboutDialog about_dialog;
		about_dialog.DoModal();
	}
	else {
		Default();
	}
}

// FUNCTION: CONFIG 0x00404150
void CMainDialog::OnPaint()
{
	if (IsIconic()) {
		CPaintDC painter(this);
		::SendMessage(m_hWnd, WM_ICONERASEBKGND, (WPARAM) painter.m_hDC, 0);
		RECT dim;
		GetClientRect(&dim);
		DrawIcon(
			painter.m_hDC,
			(dim.right - dim.left - GetSystemMetrics(SM_CXICON) + 1) / 2,
			(dim.bottom - dim.top - GetSystemMetrics(SM_CYICON) + 1) / 2,
			m_icon
		);
	}
	else {
		Default();
	}
}

// FUNCTION: CONFIG 0x00404230
HCURSOR CMainDialog::OnQueryDragIcon()
{
	return m_icon;
}

// FUNCTION: CONFIG 0x00404240
void CMainDialog::OnList3DevicesSelectionChanged()
{
	LegoDeviceEnumerate* device_enumerator = currentConfigApp->m_device_enumerator;
	int selected = ::SendMessage(GetDlgItem(IDC_LIST_3DDEVICES)->m_hWnd, LB_GETCURSEL, 0, 0);
	device_enumerator->GetDevice(selected, currentConfigApp->m_driver, currentConfigApp->m_device);
	if (currentConfigApp->GetHardwareDeviceColorModel()) {
		GetDlgItem(IDC_CHK_DRAW_CURSOR)->EnableWindow(TRUE);
	}
	else {
		currentConfigApp->m_3d_video_ram = FALSE;
		currentConfigApp->m_flip_surfaces = FALSE;
		CheckDlgButton(IDC_CHK_3D_VIDEO_MEMORY, currentConfigApp->m_3d_video_ram);
		CheckDlgButton(IDC_CHK_FLIP_VIDEO_MEM_PAGES, currentConfigApp->m_flip_surfaces);
	}
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404320
void CMainDialog::OnCancel()
{
	CDialog::OnCancel();
}

// FUNCTION: CONFIG 0x00404330
void CMainDialog::OnDestroy()
{
	CDialog::Default();
}

// FUNCTION: CONFIG 0x00404340
void CMainDialog::OnButtonCancel()
{
	if (m_modified) {
		currentConfigApp->WriteRegisterSettings();
	}
	OnCancel();
}

// FUNCTION: CONFIG 0x00404360
void CMainDialog::UpdateInterface()
{
	currentConfigApp->ValidateSettings();
	GetDlgItem(IDC_CHK_3D_VIDEO_MEMORY)
		->EnableWindow(!currentConfigApp->m_flip_surfaces && !currentConfigApp->GetHardwareDeviceColorModel());
	CheckDlgButton(IDC_CHK_FLIP_VIDEO_MEM_PAGES, currentConfigApp->m_flip_surfaces);
	CheckDlgButton(IDC_CHK_3D_VIDEO_MEMORY, currentConfigApp->m_3d_video_ram);
	BOOL full_screen = currentConfigApp->m_full_screen;
	currentConfigApp->AdjustDisplayBitDepthBasedOnRenderStatus();
	if (currentConfigApp->GetHardwareDeviceColorModel()) {
		CheckDlgButton(IDC_CHK_DRAW_CURSOR, TRUE);
	}
	else {
		CheckDlgButton(IDC_CHK_DRAW_CURSOR, FALSE);
		currentConfigApp->m_draw_cursor = FALSE;
		GetDlgItem(IDC_CHK_DRAW_CURSOR)->EnableWindow(FALSE);
	}
	if (full_screen) {
		CheckRadioButton(
			IDC_RAD_PALETTE_256,
			IDC_RAD_PALETTE_16BIT,
			currentConfigApp->m_display_bit_depth == 8 ? IDC_RAD_PALETTE_256 : IDC_RAD_PALETTE_16BIT
		);
	}
	else {
		CheckDlgButton(IDC_RAD_PALETTE_256, 0);
		CheckDlgButton(IDC_RAD_PALETTE_16BIT, 0);
		currentConfigApp->m_display_bit_depth = 0;
	}
	GetDlgItem(IDC_RAD_PALETTE_256)
		->EnableWindow(full_screen && currentConfigApp->GetConditionalDeviceRenderBitDepth());
	GetDlgItem(IDC_RAD_PALETTE_16BIT)->EnableWindow(full_screen && currentConfigApp->GetDeviceRenderBitStatus());
	CheckDlgButton(IDC_CHK_3DSOUND, currentConfigApp->m_3d_sound);
	CheckDlgButton(IDC_CHK_DRAW_CURSOR, currentConfigApp->m_draw_cursor);
	switch (currentConfigApp->m_model_quality) {
	case 1:
		CheckRadioButton(IDC_RAD_MODEL_QUALITY_LOW, IDC_RAD_MODEL_QUALITY_HIGH, IDC_RAD_MODEL_QUALITY_LOW);
		break;
	case 2:
		CheckRadioButton(IDC_RAD_MODEL_QUALITY_LOW, IDC_RAD_MODEL_QUALITY_HIGH, IDC_RAD_MODEL_QUALITY_HIGH);
		break;
	}
	CheckRadioButton(
		IDC_RAD_TEXTURE_QUALITY_LOW,
		IDC_RAD_TEXTURE_QUALITY_HIGH,
		currentConfigApp->m_texture_quality == 0 ? IDC_RAD_TEXTURE_QUALITY_LOW : IDC_RAD_TEXTURE_QUALITY_HIGH
	);
	CheckDlgButton(IDC_CHK_JOYSTICK, currentConfigApp->m_use_joystick);
	CheckDlgButton(IDC_CHK_MUSIC, currentConfigApp->m_music);
}

// FUNCTION: CONFIG 0x004045e0
void CMainDialog::OnCheckbox3DSound()
{
	currentConfigApp->m_3d_sound = IsDlgButtonChecked(IDC_CHK_3DSOUND);
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404610
void CMainDialog::OnCheckbox3DVideoMemory()
{
	currentConfigApp->m_3d_video_ram = IsDlgButtonChecked(IDC_CHK_3D_VIDEO_MEMORY);
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404640
void CMainDialog::OnRadiobuttonPalette16bit()
{
	currentConfigApp->m_display_bit_depth = 16;
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404670
void CMainDialog::OnRadiobuttonPalette256()
{
	currentConfigApp->m_display_bit_depth = 8;
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x004046a0
void CMainDialog::OnCheckboxFlipVideoMemPages()
{
	currentConfigApp->m_flip_surfaces = IsDlgButtonChecked(IDC_CHK_FLIP_VIDEO_MEM_PAGES);
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x004046d0
void CMainDialog::OnRadiobuttonModelLowQuality()
{
	currentConfigApp->m_model_quality = 1;
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404700
void CMainDialog::OnRadiobuttonModelHighQuality()
{
	currentConfigApp->m_model_quality = 2;
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404730
void CMainDialog::OnRadiobuttonTextureLowQuality()
{
	currentConfigApp->m_texture_quality = 0;
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404760
void CMainDialog::OnRadiobuttonTextureHighQuality()
{
	currentConfigApp->m_texture_quality = 1;
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x00404790
void CMainDialog::OnCheckboxJoystick()
{
	currentConfigApp->m_use_joystick = IsDlgButtonChecked(IDC_CHK_JOYSTICK);
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x004047c0
void CMainDialog::OnButtonAdvanced()
{
	SwitchToAdvanced(!m_advanced);
}

// FUNCTION: CONFIG 0x004047d0
void CMainDialog::SwitchToAdvanced(BOOL p_advanced)
{
	RECT dialog_rect;
	RECT grp_advanced_rect;
	::GetWindowRect(m_hWnd, &dialog_rect);
	::GetWindowRect(GetDlgItem(IDC_GRP_ADVANCED)->m_hWnd, &grp_advanced_rect);
	CWnd* button_advanced = GetDlgItem(IDC_BTN_ADVANCED);
	m_advanced = p_advanced;
	int height;
	if (p_advanced) {
		height = grp_advanced_rect.bottom - dialog_rect.top + 10;
		GetDlgItem(IDC_BMP_SHARK)->EnableWindow(TRUE);
		button_advanced->SetWindowText("Basic");
	}
	else {
		height = grp_advanced_rect.top - dialog_rect.top;
		GetDlgItem(IDC_BMP_SHARK)->EnableWindow(FALSE);
		button_advanced->SetWindowText("Advanced");
	}
	SetWindowPos(&wndTop, 0, 0, dialog_rect.right - dialog_rect.left, height, SWP_NOMOVE);
}

// FUNCTION: CONFIG 0x00404890
void CMainDialog::OnCheckboxDrawCursor()
{
	currentConfigApp->m_draw_cursor = IsDlgButtonChecked(IDC_CHK_DRAW_CURSOR);
	m_modified = TRUE;
	UpdateInterface();
}

// FUNCTION: CONFIG 0x004048c0
void CMainDialog::OnCheckboxMusic()
{
	currentConfigApp->m_music = IsDlgButtonChecked(IDC_CHK_MUSIC);
	m_modified = TRUE;
	UpdateInterface();
}