// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: gui.js
// DESC: Provides GUI functionality and styles (using MexUI)
// TYPE: Client (JavaScript)
// ===========================================================================

var app = {};

let mainFont = "Roboto"; // "Arial"

//let mainLogoPath = (typeof gta == "undefined") ? "files/images/mafiac-logo.png" : "files/images/gtac-logo.png";
let mainLogoPath = "files/images/asshat-logo.png";

let primaryColour = [200, 200, 200];
let secondaryColour = [16, 16, 16];
let primaryTextColour = [0, 0, 0];
let focusedColour = [200, 200, 200];
let invalidValueColour = [200, 200, 200];

let focusedColourOffset = 50;

let windowAlpha = 200;
let windowTitleAlpha = 180;
let buttonAlpha = 180;
let textInputAlpha = 180;

let guiReady = false;

// ===========================================================================

let characterData = [];
let currentCharacter = 0;

let inCharacterSelectScreen = false;
let creatingCharacter = false;

// ===========================================================================

function initGUIScript() {
	logToConsole(LOG_DEBUG, "[VRR.GUI]: Initializing GUI script ...");
	logToConsole(LOG_DEBUG, "[VRR.GUI]: GUI script initialized!");
}

// ===========================================================================

function initGUI() {
	logToConsole(LOG_DEBUG, `[VRR.GUI] Initializing GUI ...`);

	initLoginGUI();
	initRegisterGUI();
	initNewCharacterGUI();
	initCharacterSelectGUI();
	initInfoDialogGUI();
	initErrorDialogGUI();
	initYesNoDialogGUI();
	initTwoFactorAuthenticationGUI();
	initListGUI();
	initResetPasswordGUI();
	initChangePasswordGUI();
	initLocaleChooserGUI();

	closeAllWindows();
	guiReady = true;

	logToConsole(LOG_DEBUG, `[VRR.GUI] All GUI created successfully!`);

	loadLocaleConfig();
	loadAllLocaleStrings();

	resetGUIStrings();
	resetLocaleChooserOptions();

	sendNetworkEventToServer("vrr.guiReady", true);
};

// ===========================================================================

function closeAllWindows() {
	logToConsole(LOG_DEBUG, `[VRR.GUI] Closing all GUI windows`);
	infoDialog.window.shown = false;
	yesNoDialog.window.shown = false;
	errorDialog.window.shown = false;
	register.window.shown = false;
	login.window.shown = false;
	newCharacter.window.shown = false;
	characterSelect.window.shown = false;
	twoFactorAuth.window.shown = false;
	listDialog.window.shown = false;
	passwordReset.window.shown = false;
	passwordChange.window.shown = false;
	localeChooser.window.shown = false;

	mexui.setInput(false);
	mexui.focusedControl = false;

	guiSubmitKey = false;
	guiLeftKey = false;
	guiRightKey = false;
	guiUpKey = false;
	guiDownKey = false;

	setChatWindowEnabled(true);
}

// ===========================================================================

function isAnyGUIActive() {
	if (!guiReady) {
		return false;
	}

	if (infoDialog.window.shown == true) {
		return true;
	}

	if (yesNoDialog.window.shown == true) {
		return true;
	}

	if (errorDialog.window.shown == true) {
		return true;
	}

	if (register.window.shown == true) {
		return true;
	}

	if (login.window.shown == true) {
		return true;
	}

	if (newCharacter.window.shown == true) {
		return true;
	}

	if (characterSelect.window.shown == true) {
		return true;
	}

	if (twoFactorAuth.window.shown == true) {
		return true;
	}

	if (listDialog.window.shown == true) {
		return true;
	}

	if (passwordReset.window.shown == true) {
		return true;
	}

	if (passwordChange.window.shown == true) {
		return true;
	}

	if (localeChooser.window.shown == true) {
		return true;
	}

	return false;
}

// ===========================================================================

function setGUIColours(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) {
	logToConsole(LOG_DEBUG, `[VRR.GUI] Received new GUI colours from server: ${red1}, ${green1}, ${blue1} / ${red2}, ${green2}, ${blue2} / ${red3}, ${green3}, ${blue3}`);
	primaryColour = [red1, green1, blue1];
	secondaryColour = [red2, green2, blue2];
	primaryTextColour = [red3, green3, blue3];
	focusedColour = [red1 + focusedColourOffset, green1 + focusedColourOffset, blue1 + focusedColourOffset];

	initGUI();
}

// ===========================================================================

function hideAllGUI() {
	closeAllWindows();
	setChatWindowEnabled(true);
	guiSubmitKey = false;
}

// ===========================================================================

function processGUIKeyPress(keyCode) {
	logToConsole(LOG_DEBUG, `[VRR.GUI] Processing key press: ${keyCode}`);

	if (!isAnyGUIActive()) {
		logToConsole(LOG_DEBUG, `[VRR.GUI] GUI is not active. Cancelling keypress processing.`);
		return false;
	}

	if (keyCode == SDLK_RETURN || keyCode == SDLK_RETURN2) {
		logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is submit (${guiSubmitKey})`);
		if (guiSubmitKey != false) {
			logToConsole(LOG_DEBUG, `[VRR.GUI] Calling submit key function`);
			guiSubmitKey.call();
		}
	} else if (keyCode == getKeyIdFromParams("left") || keyCode == getKeyIdFromParams("a")) {
		logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is left (${guiLeftKey})`);
		if (guiLeftKey != false) {
			logToConsole(LOG_DEBUG, `[VRR.GUI] Calling left key function`);
			guiLeftKey.call();
		}
	} else if (keyCode == getKeyIdFromParams("right") || keyCode == getKeyIdFromParams("d")) {
		logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is right (${guiRightKey})`);
		if (guiRightKey != false) {
			logToConsole(LOG_DEBUG, `[VRR.GUI] Calling right key function`);
			guiRightKey.call();
		}
	} else if (keyCode == getKeyIdFromParams("down") || keyCode == getKeyIdFromParams("s")) {
		logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is down (${guiDownKey})`);
		if (guiDownKey != false) {
			logToConsole(LOG_DEBUG, `[VRR.GUI] Calling down key function`);
			guiDownKey.call();
		}
	} else if (keyCode == getKeyIdFromParams("up") || keyCode == getKeyIdFromParams("w")) {
		logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is up (${guiUpKey})`);
		if (guiUpKey != false) {
			logToConsole(LOG_DEBUG, `[VRR.GUI] Calling up key function`);
			guiUpKey.call();
		}
	}
}

// ===========================================================================

function processToggleGUIKeyPress(keyCode) {
	if (keyCode == disableGUIKey) {
		sendNetworkEventToServer("vrr.toggleGUI");
	}
}

// ===========================================================================

function resetGUIStrings() {
	// Login GUI
	login.messageLabel.text = getLocaleString("GUILoginWindowLabelEnterPassword");
	login.passwordInput.placeholder = getLocaleString("GUILoginWindowPasswordPlaceholder");
	login.loginButton.text = toUpperCase(getLocaleString("GUILoginWindowSubmitButton"));
	login.forgotPasswordButton.text = toUpperCase(getLocaleString("GUILoginWindowResetPasswordButton"));
	login.resetPasswordLabel.text = getLocaleString("GUILoginWindowForgotPasswordLabel");

	// Register GUI
	register.messageLabel.text = getLocaleString("GUIRegisterWindowLabelCreateAccount");
	register.passwordInput.placeholder = getLocaleString("GUIRegisterWindowPasswordPlaceholder");
	register.confirmPasswordInput.placeholder = getLocaleString("GUIRegisterWindowConfirmPasswordPlaceholder");
	register.emailInput.placeholder = getLocaleString("GUIRegisterWindowEmailPlaceholder");
	register.registerButton.text = toUpperCase(getLocaleString("GUIRegisterWindowSubmitButton"));

	// Change Password GUI
	passwordChange.window.title = toUpperCase(getLocaleString("GUIChangePasswordWindowTitle"));
	passwordChange.messageLabel.text = getLocaleString("GUIChangePasswordPasswordLabel");
	passwordChange.passwordInput.placeholder = getLocaleString("GUIChangePasswordPasswordPlaceholder");
	passwordChange.confirmPasswordInput.placeholder = getLocaleString("GUIChangePasswordConfirmPasswordPlaceholder");
	passwordChange.submitButton.text = toUpperCase(getLocaleString("GUIChangePasswordSubmitButton"));

	// Reset Password GUI
	passwordReset.messageLabel.text = toUpperCase(getLocaleString("GUIResetPasswordConfirmEmailLabel"));
	passwordReset.emailInput.placeholder = getLocaleString("GUIResetPasswordEmailPlaceholder");
	passwordReset.resetPasswordButton.text = toUpperCase(getLocaleString("GUIResetPasswordSubmitButton"));
	passwordReset.backToLoginButton.text = toUpperCase(getLocaleString("GUIResetPasswordLoginButton"));
	passwordReset.backToLoginLabel.text = getLocaleString("GUIResetPasswordRememberMessage");

	// Character Selection GUI
	characterSelect.window.title = toUpperCase(getLocaleString("GUICharacterSelectWindowTitle"));
	characterSelect.cashText.text = getLocaleString("GUICharacterSelectMoneyLabel", "0");
	characterSelect.clanText.text = getLocaleString("GUICharacterSelectClanLabel", "None");
	characterSelect.lastPlayedText.text = getLocaleString("GUICharacterSelectLastPlayedLabel", "Never");
	characterSelect.previousCharacterButton.text = toUpperCase(getLocaleString("GUIPreviousCharacterButton"));
	characterSelect.nextCharacterButton.text = toUpperCase(getLocaleString("GUINextCharacterButton"));
	characterSelect.selectCharacterButton.text = toUpperCase(getLocaleString("GUIPlayAsCharacterButton"));
	characterSelect.newCharacterButton.text = toUpperCase(getLocaleString("GUINewCharacterButton"));

	// Character Creation GUI
	newCharacter.messageLabel.text = getLocaleString("GUINewCharacterMessageLabel");
	newCharacter.firstNameInput.placeholder = getLocaleString("GUINewCharacterFirstNamePlaceholder");
	newCharacter.lastNameInput.placeholder = getLocaleString("GUINewCharacterLastNamePlaceholder");
	newCharacter.createCharacterButton.text = toUpperCase(getLocaleString("GUINewCharacterSubmitButton"));
}