#include "InstallerMain.h"
#include "InstallerUtil.h"
#include "SelectGame.h"
#include "GamesList.h"
#include "ChooseMethod.h"
#include "PerformInstall.h"
#include "LocalCopyMethod.h"

int selected_game_index = -1;

void UpdateGameListBox(HWND hDlg, game_list_t *gl)
{
	HWND lbox = GetDlgItem(hDlg, IDC_SELGAME_LIST);

	SendMessage(lbox, LB_RESETCONTENT, 0, 0);

	for (unsigned int i = 0; i < gl->game_count; i++)
	{
		LRESULT res = SendMessage(lbox,
			LB_ADDSTRING,
			0,
			(LPARAM)g_games.game_list[gl->games[i]].name);

		if (res == LB_ERR || res == LB_ERRSPACE)
		{
			continue;
		}

		SendMessage(lbox, LB_SETITEMDATA, i, gl->games[i]);
	}
	
	UpdateWindow(lbox);
}

#include "windowsx.h"

INT_PTR CALLBACK ChooseGameHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		{
			HWND cbox = GetDlgItem(hDlg, IDC_SELGROUP_ACCOUNT);
			SendMessage(cbox, CB_RESETCONTENT, 0, 0);
			for (unsigned int i = 0; i < g_game_group->list_count; i++)
			{
				LRESULT res = SendMessage(cbox, 
					CB_ADDSTRING, 
					0, 
					(LPARAM)g_game_group->lists[i]->root_name);
				if (res == CB_ERR || res == CB_ERRSPACE)
				{
					continue;
				}
				SendMessage(cbox, CB_SETITEMDATA, i, (LPARAM)g_game_group->lists[i]);
			}
			SendMessage(cbox, CB_SETCURSEL, 0, 0);
			UpdateWindow(cbox);
			UpdateGameListBox(hDlg, g_game_group->lists[0]);

			SetToGlobalPosition(hDlg);
			
			return (INT_PTR)TRUE;
		}
	case WM_COMMAND:
		{
			if (LOWORD(wParam) == ID_SELGAME_EXIT
				|| LOWORD(wParam) == ID_CLOSE)
			{
				return AskToExit(hDlg);
			}
			else if (LOWORD(wParam) == ID_SELGAME_BACK)
			{
				UpdateGlobalPosition(hDlg);
				EndDialog(hDlg, (INT_PTR)DisplayChooseMethod);
				return (INT_PTR)TRUE;
			}
			else if (LOWORD(wParam) == IDC_SELGROUP_ACCOUNT)
			{
				if (HIWORD(wParam) == CBN_SELCHANGE)
				{
					HWND cbox = (HWND)lParam;
					LRESULT cursel = SendMessage(cbox, CB_GETCURSEL, 0, 0);

					if (cursel == LB_ERR)
					{
						break;
					}

					LRESULT data = SendMessage(cbox, CB_GETITEMDATA, cursel, 0);
					if (data == CB_ERR)
					{
						break;
					}

					game_list_t *gl = (game_list_t *)data;
					UpdateGameListBox(hDlg, gl);
				}
				break;
			}
			else if (LOWORD(wParam) == IDC_SELGAME_LIST)
			{
				if (HIWORD(wParam) == LBN_SELCHANGE)
				{
					HWND lbox = (HWND)lParam;
					LRESULT cursel = SendMessage(lbox, LB_GETCURSEL, 0, 0);

					selected_game_index = -1;

					if (cursel == LB_ERR)
					{
						break;
					}

					LRESULT item = SendMessage(lbox, LB_GETITEMDATA, cursel, 0);
					if (item == LB_ERR)
					{
						break;
					}

					selected_game_index = (int)item;

					HWND button = GetDlgItem(hDlg, ID_SELGAME_NEXT);
					EnableWindow(button, TRUE);
				}
			}
			else if (LOWORD(wParam) == ID_SELGAME_NEXT)
			{
				if (selected_game_index == -1)
				{
					break;
				}

				g_LocalCopier.SetOutputPath(g_games.game_list[selected_game_index].game_path);
				SetInstallMethod(&g_LocalCopier);

				UpdateGlobalPosition(hDlg);
				EndDialog(hDlg, (INT_PTR)DisplayPerformInstall);

				return (INT_PTR)TRUE;
			}
			break;
		}
	case WM_DESTROY:
		{
			ReleaseGameDB();
			break;
		}
	}

	return (INT_PTR)FALSE;
}

void *DisplaySelectGame(HWND hWnd)
{
	INT_PTR val;
	
	if ((val = DialogBox(
		g_hInstance, 
		MAKEINTRESOURCE(IDD_SELECT_GAME),
		hWnd,
		ChooseGameHandler)) == -1)
	{
		return NULL;
	}

	return (void *)val;
}