var MenuApp = {

	preload: function() {
		game.load.image('icon_fullscreen', '../../../resources/image/icon/fullscreen_white.png');
	},

	create: function() {
		game.stage.backgroundColor = '#4d4d4d';

		// mouse app area
		var mouseBG = new AppAreaBG(
			AppAreaBG.COLOR_MOUSE_APP, 1,
			0, 60,
			GAME_SCREEN_SIZE.x, 280
		);
		mouseBG.printText(
			"마우스 연습 앱",
			game.world.centerX, 200,
			170, "#000", 0.03
		);

		// typing app area
		var typingBG = new AppAreaBG(
			AppAreaBG.COLOR_TYPING_APP, 1,
			0, 340,
			GAME_SCREEN_SIZE.x, 378
		);
		typingBG.printText(
			"타 자  연 습 앱",
			game.world.centerX, 490,
			170, "#000", 0.03
		);


		// keyboard shortcut
		this.keyboardShortcut = new KeyboardShortcut();
		this.keyboardShortcut.addCallback(
			Phaser.KeyCode.ESC,	// keyCode
			null,	// keyDownHandler
			(function() { this.back(); }).bind(this),	// keyUpHandler
			"menu_app"	// callerClassName
		);

		// top ui
		var screenTopUI = new ScreenTopUI();
		screenTopUI.makeBackButton( (function() { this.back(); }).bind(this) );
		screenTopUI.makeFullScreenButton();
		this.loadAllowEditEnterCode(screenTopUI);


		// bottom ui
		var screenBottomUI = new ScreenBottomUI();
		// ScreenBottomUI.printLeftText("게임 진행 정보");
		// var playingAppName = appInfoManager.getAppNameKorean(sessionStorageManager.playingAppName);
		// ScreenBottomUI.printCenterText(playingAppName);
		screenBottomUI.printCenterText("메뉴");
		screenBottomUI.printRightText(sessionStorageManager.getPlayerName());

		new WelcomePlayerText(sessionStorageManager.getPlayerName());
		if(isExperiencePlayerAccount()) {
			game.time.events.add(Phaser.Timer.SECOND * 2.5,
				(function() { new NoticeExperiencePlayerText(); } ),
				this
			);
		}


		this.loadAppData();
	},


	back: function() {
		sessionStorageManager.clear();
		location.href = '../../web/client/login.html';
	},

	loadAllowEditEnterCode: function(screenTopUI) {
		var dbConnectManager = new DBConnectManager();
		dbConnectManager.requestAllowEditEnterCode(
			sessionStorageManager.getMaestroID(),

			(function(replyJSON) {
				if(replyJSON["AllowEditEnterCode"] == "1") {
					screenTopUI.makeSetupButton( (function() {
						console.log("setup");
						location.href = '../../web/client/setup.html';
					}).bind(this) );
				}
			}).bind(this),

			(function(replyJSON) {
				this.loadFailed(replyJSON);
			}).bind(this)
		);
	},

	loadAppData: function() {
		var dbConnectManager = new DBConnectManager();
		dbConnectManager.requestMenuAppList(
			sessionStorageManager.getMaestroID(),
			(function(replyJSON) {
				this.loadSucceeded(replyJSON);
			}).bind(this),
			(function(replyJSON) {
				this.loadFailed(replyJSON);
			}).bind(this)
		);
	},

	loadSucceeded: function(replyJSON) {
		// console.log(replyJSON);

		this.makeMouseAppButtons(
			replyJSON.MouseAppList,
			replyJSON.MouseActiveAppList
		);
		this.makeTypingButtons(
			replyJSON.TypingPracticeAppCount,
			replyJSON.TypingTestAppCount,
			replyJSON.TypingAppList,
			replyJSON.TypingActiveAppList
		);
	},

	hasApp: function(appID, appList) {
		for(var i = 0; i < appList.length; i++) {
			if(appList[i].AppID === appID)
				return true;
		}

		return false;
	},

	makeMouseAppButtons: function(appList, activeAppList) {
		// console.log(appList);

		var mouseAppCount = Object.keys(appList).length;

		for(var i = 0; i < mouseAppCount; i++) {
			var posX = this.getButtonPosX(i, mouseAppCount);
			var posY = this.getButtonPosY(i, mouseAppCount, GameAppButton.BUTTON_UPPER_POS_Y);

			var app = appList[i];
			var gameAppButton = new GameAppButton(
				posX, posY,
				GameAppButton.TYPE_MOUSE_APP,
				RoundRectButton.NONE_ICON,	app.KoreanName,
				{
					AppID: app.AppID,
					AppName: app.AppName,
					KoreanName: app.KoreanName
				}
			);

			if(!this.hasApp(app.AppID, activeAppList))
				gameAppButton.setInputEnabled(false);
		}
	},

	makeTypingButtons: function(typingPracticeAppCount, typingTestAppCount, appList, activeAppList) {
		// console.log(typingPracticeAppCount);
		// console.log(typingTestAppCount);
		// console.log(appList);

		var isTypingPracticeAppExist = typingPracticeAppCount > 0 ? true : false;
		var isTypingTestAppExist = typingTestAppCount > 0 ? true : false;

		var typingAppTotalCount = Object.keys(appList).length;
		var typingAppIndex = 0;


		// typing tab buttons
		var typingPracticeTabButton = new TypingTabButton(
			TypingTabButton.PRACTICE_BUTTON_POS_X, TypingTabButton.BUTTON_POS_Y,
			"", "타자 연습",
			(function() {
				location.href = '../../web/client/menu_typing_practice.html';
			})
		);
		if(typingPracticeAppCount === 0)
			typingPracticeTabButton.setInputEnabled(false);

		var typingTestTabButton = new TypingTabButton(
			TypingTabButton.TEST_BUTTON_POS_X, TypingTabButton.BUTTON_POS_Y,
			"", "타자 시험",
			(function() {
				location.href = '../../web/client/menu_typing_test.html';
			})
		);
		if(typingTestAppCount === 0)
			typingTestTabButton.setInputEnabled(false);


		// typing app buttons
		for(var typingButtonIndex = 0; typingButtonIndex < typingAppTotalCount; typingButtonIndex++) {

			var posX = this.getButtonPosX(
				typingButtonIndex, typingAppTotalCount
			);
			var posY = this.getButtonPosY(
				typingButtonIndex, typingAppTotalCount, GameAppButton.BUTTON_LOWER_POS_Y
			);

			var app = appList[typingAppIndex];
			var isKoreanTypingApp = app.AppID < 32 ? true : false;

			var gameAppButton = new GameAppButton(
				posX, posY, GameAppButton.TYPE_TYPING_APP,
				RoundRectButton.NONE_ICON,	// "icon_fullscreen",
				// (isKoreanTypingApp ? "(한글)" : "(영문)") + "\n" + app.KoreanName,
				app.KoreanName,
				{
					AppID: app.AppID,
					AppName: app.AppName,
					KoreanName: app.KoreanName
				}
			);

			if(!this.hasApp(app.AppID, activeAppList))
				gameAppButton.setInputEnabled(false);

			typingAppIndex++;
		}
	},

	getButtonPosX: function(index, buttonCount) {
		var gap = GameAppButton.BUTTON_WIDTH + GameAppButton.BUTTON_GAP;
		var maxColumnNum = Math.floor( (game.world.width - GameAppButton.MARGIN_VERTICAL) / gap );
		// console.log("maxColumnNum : " + maxColumnNum);
		var rowCount = Math.ceil(buttonCount / maxColumnNum);
		// console.log("rowCount : " + rowCount);

		var columnIndex = index % maxColumnNum;
		// console.log("columnIndex : " + columnIndex);
		var rowIndex = Math.floor(index / maxColumnNum);
		// console.log("rowIndex : " + rowIndex);

		var columnCountForThisRow = 0;
		if(rowIndex < rowCount - 1)
			columnCountForThisRow = maxColumnNum;
		else
			columnCountForThisRow = buttonCount - (maxColumnNum * rowIndex);
		// console.log("columnCountForThisRow : " + columnCountForThisRow);

		var startX = game.world.width / 2 - ( (gap / 2) * (columnCountForThisRow - 1) );
		return startX + gap * columnIndex;
	},

	getButtonPosY: function(index, buttonCount, startPosY) {
		var gap = GameAppButton.BUTTON_HEIGHT + GameAppButton.BUTTON_GAP;
		var maxColumnNum = Math.floor( (game.world.width - GameAppButton.MARGIN_VERTICAL) / gap );
		// console.log("maxColumnNum : " + maxColumnNum);
		var rowCount = Math.ceil(buttonCount / maxColumnNum);
		// console.log("rowCount : " + rowCount);

		var rowIndex = Math.floor(index / maxColumnNum);
		// console.log("rowIndex : " + rowIndex);

		var startY = startPosY - ( (gap / 2) * (rowCount - 1) );
		return startY + gap * rowIndex;
	},

	loadFailed: function(replyJSON) {
		// console.log('login failed, jsonData : ' + JSON.stringify(replyJSON));
	}
}