var MATTIE = MATTIE || {};
MATTIE.menus.multiplayer = MATTIE.menus.multiplayer || {};
MATTIE.scenes.multiplayer = MATTIE.scenes.multiplayer || {};
MATTIE.windows.multiplayer = MATTIE.windows.multiplayer || {};
MATTIE.TextManager = MATTIE.TextManager || {};
MATTIE.CmdManager = MATTIE.CmdManager || {};
MATTIE.TextManager.joinGame = 'Join';
MATTIE.TextManager.returnToMultiplayer = 'Return';
MATTIE.CmdManager.joinGame = 'MATTIE_Join_Game';
MATTIE.CmdManager.returnToMultiplayer = 'MATTIE_ReturnToMulti';
MATTIE.TextManager.reconnect = 'Reconnect';
MATTIE.CmdManager.reconnect = 'MATTIE_Reconnect';

/**
 * @description The scene for hosting a multiplayer game
 * @extends Scene_Base
 * @class
 */
MATTIE.scenes.multiplayer.join = function () {
	this.initialize.apply(this, arguments);
};
MATTIE.scenes.multiplayer.join.prototype = Object.create(MATTIE.scenes.multiplayer.base.prototype); // extend Scene_Base
MATTIE.scenes.multiplayer.join.prototype.constructor = MATTIE.scenes.multiplayer.join; // use constructor

MATTIE.scenes.multiplayer.join.prototype.create = function () {
	MATTIE.scenes.multiplayer.base.prototype.create.call(this);
	this.createWindowLayer();

	// Ensure we respect user override or current state
	if (MATTIE.multiplayer.userOverrideFallback === true) {
		MATTIE.multiplayer.forceFallback = true;
	} else if (MATTIE.multiplayer.userOverrideFallback === false) {
		MATTIE.multiplayer.forceFallback = false;
	}

	this.addOptionsBtns();
	this.addTextField();
	// this.addFallbackToggle();
};

MATTIE.scenes.multiplayer.join.prototype.addFallbackToggle = function () {
	const text = `Use TCP Fallback: ${MATTIE.multiplayer.forceFallback ? '[ON]' : '[OFF]'}`;
	const btns = {};
	btns[text] = 'TOGGLE_FALLBACK';

	this._fallbackWin = new MATTIE.windows.HorizontalBtns(200, btns, 1); // Position below text input
	this._fallbackWin.x = 20;
	this._fallbackWin.width = 300;

	this._fallbackWin.setHandler('TOGGLE_FALLBACK', () => {
		const newState = !MATTIE.multiplayer.forceFallback;
		MATTIE.multiplayer.forceFallback = newState;
		MATTIE.multiplayer.userOverrideFallback = newState; // User manual overrides auto logic

		this._fallbackWin._list[0].name = `Use TCP Fallback: ${newState ? '[ON]' : '[OFF]'}`;
		this._fallbackWin.refresh();
		this._fallbackWin.activate();
	});
	this.addWindow(this._fallbackWin);
};

MATTIE.scenes.multiplayer.join.prototype.addTextField = function () {
	this._inputWin = new MATTIE.windows.TextInput(0, 0, 500, 150, 'Enter your connection key below:');
	this.addWindow(this._inputWin);
};
MATTIE.scenes.multiplayer.join.prototype.addOptionsBtns = function () {
	const btns = {};
	btns[MATTIE.TextManager.joinGame] = MATTIE.CmdManager.joinGame;
	btns[MATTIE.TextManager.returnToMultiplayer] = MATTIE.CmdManager.returnToMultiplayer;
	btns[MATTIE.TextManager.reconnect] = MATTIE.CmdManager.reconnect;
	const enabled = {};
	enabled[MATTIE.TextManager.reconnect] = {};
	const netCont = MATTIE.multiplayer.getCurrentNetController();
	enabled[MATTIE.TextManager.reconnect].val = netCont ? netCont.canTryToReconnect : false;

	this._optionsWindow = new MATTIE.windows.HorizontalBtns(175 + 300 + 10, btns, 3, enabled);

	this._optionsWindow.setHandler(MATTIE.CmdManager.joinGame, (() => {
		this._inputWin.close();
		const inputVal = (this._inputWin.getInput()).trim();

		// Regex to detect IP addresses (IP, IP:Port, IP_Suffix, IP:Port_Suffix)
		const ipRegex = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?(_[\w]+)?$/;
		let decodedHostId = inputVal;

		// If input matches IP pattern directly, use it as-is (Raw IP)
		if (ipRegex.test(inputVal)) {
			console.log('Input detected as raw IP address');
			decodedHostId = inputVal;
		} else {
			// Otherwise try to decode base64
			try {
				const decoded = atob(inputVal);
				decodedHostId = decoded;
				console.log('Decoded peer ID from base64');
			} catch (e) {
				console.warn('Input is not base64, using as-is (legacy/raw format)');
				decodedHostId = inputVal;
			}
		}

		MATTIE.multiplayer.clientController.hostId = decodedHostId;

		// Auto-detect IP format if no user override is set
		if (MATTIE.multiplayer.userOverrideFallback === null) {
			const isIpLike = ipRegex.test(decodedHostId);
			if (isIpLike) {
				console.log('Detected IP address input, auto-switching to Fallback TCP.');
				MATTIE.multiplayer.forceFallback = true;
				// Update UI for clarity
				if (this._fallbackWin) {
					this._fallbackWin._list[0].name = 'Use TCP Fallback: [ON]';
					this._fallbackWin.refresh();
				}
			} else {
				// Assume PeerJS ID
				MATTIE.multiplayer.forceFallback = false;
			}
		}

		MATTIE.menus.multiplayer.openLobby();
	}));

	this._optionsWindow.setHandler(MATTIE.CmdManager.returnToMultiplayer, (() => {
		this._inputWin.close();
		MATTIE.menus.multiplayer.openMultiplayer();
	}));

	this._optionsWindow.setHandler(MATTIE.CmdManager.reconnect, (() => {
		this._inputWin.close();
		MATTIE.multiplayer.getCurrentNetController().reconnectAllConns();
		MATTIE.menus.multiplayer.openGame();
	}));

	this.addWindow(this._optionsWindow);
	this._optionsWindow.updateWidth(600);
	this._optionsWindow.updatePlacement(175 + 300 + 10);
};

// Ensure event listeners are cleaned up when leaving the scene
MATTIE.scenes.multiplayer.join.prototype.terminate = function () {
	if (this._inputWin) {
		this._inputWin.close();
	}
	MATTIE.scenes.multiplayer.base.prototype.terminate.call(this);
};