var MenuTypingTest = {

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

		Animal.loadResources();
	},

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

		// typing app area
		var typingBG = new AppAreaBG(AppAreaBG.COLOR_TYPING_APP, 1,
			0, 60,
			GAME_SCREEN_SIZE.x, GAME_SCREEN_SIZE.y - 110
		);

		// korean app area
		// var koreanBG = new AppAreaBG(AppAreaBG.COLOR_TYPING_KOREAN, 1,
		// 	0, 60 + AppAreaBG.GAP_Y,
		// 	GAME_SCREEN_SIZE.x, 270
		// );
		// koreanBG.printText(
		// 	"한          글          타          자",
		// 	game.world.centerX, 320,
		// 	36, "#000", 0.05
		// );

		// english app area
		// var englishBG = new AppAreaBG(AppAreaBG.COLOR_TYPING_ENGLISH, 1,
		// 	0, 340,
		// 	GAME_SCREEN_SIZE.x, 270
		// );
		// englishBG.printText(
		// 	"영          문          타          자",
		// 	game.world.centerX, 370,
		// 	36, "#000", 0.05
		// );


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

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


		// 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';
			})
		);
		// 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';
			})
		);
		typingTestTabButton.setInputEnabled(false);


		this.animalRecordList = new AnimalRecordList();
		this.animalRecordList.printScore(AnimalRecordList.TYPE_TEST);

		this.makeActiveTypingTestAppButtons();


		// bottom ui
		var screenBottomUI = new ScreenBottomUI();
		// screenBottomUI.printLeftText("게임 진행 정보");
		screenBottomUI.printCenterText("메뉴 > 타자 시험");
		screenBottomUI.printRightText(sessionStorageManager.getPlayerName());
	},


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

	makeActiveTypingTestAppButtons: function() {
		var dbConnectManager = new DBConnectManager();
		dbConnectManager.requestTypingTestAppList(
			sessionStorageManager.getMaestroID(),
			sessionStorageManager.getPlayerID(),
			// self.downloadListSucceeded,
			// self.downloadListFailed
			(function(replyJSON) {
				this.downloadListSucceeded(replyJSON);
			}).bind(this),
			(function(replyJSON) {
				this.downloadListFailed(replyJSON);
			}).bind(this)
		);

	},

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

		return false;
	},

	getAppHighestRecord: function(jsonList, appID) {
		var count = jsonList.length;	// Object.keys(jsonList).length;

		for(var i = 0; i < count; i++) {
			if(jsonList[i].AppID === appID)
				return jsonList[i].AppHighestRecord;
		}

		return 0;
	},

	getAnimalSprite: function(jsonList, appID) {
		var appHighestRecord = this.getAppHighestRecord(jsonList, appID);
		var animalSprite = null;

		if(appHighestRecord === 0) {
			animalSprite = new Animal(Animal.TYPE_ICON, 0, 0, 0);
			// animalSprite.sprite.tint = RoundRectButtonSetting.DEFAULT_BUTTON_COLORS.disabled;
		} else {
			var animalLevel = Animal.animalLevelIDByRecord(appHighestRecord, Animal.TYPE_TEST);
			animalSprite = new Animal(Animal.TYPE_ICON, animalLevel, 0, 0);
		}

		return animalSprite;
	},

	downloadListSucceeded: function(replyJSON) {
		console.log(replyJSON);

		var buttonWidthGap = TypingAppButton.BUTTON_WIDTH + MenuTypingTest.BUTTON_GAP;

		var koreanTypingPracticeAppCount = replyJSON.KoreanAppList.length;	// Object.keys(replyJSON.KoreanAppList).length;
		var englishTypingPracticeAppCount = replyJSON.EnglishAppList.length;	// Object.keys(replyJSON.EnglishAppList).length;

		for(var i = 0; i < koreanTypingPracticeAppCount; i++) {
			var activeApp = replyJSON.KoreanAppList[i];

			var posX = this.getButtonPosX(i, koreanTypingPracticeAppCount);
			var posY = this.getButtonPosY(i, koreanTypingPracticeAppCount,
				TypingAppButton.BUTTON_UPPER_POS_Y
			);

			var typingTestButton = new TypingAppButton(
				TypingAppButton.TYPE_TEST_KOREAN,
				posX, posY,
				this.getAnimalSprite(replyJSON.KoreanHighScoreList, activeApp.AppID),
				activeApp.KoreanName,
				{
					AppID: activeApp.AppID,
					AppName: activeApp.AppName,
					KoreanName: activeApp.KoreanName
				}
			);

			if(!this.hasApp(activeApp.AppID, replyJSON.KoreanActiveAppList))
				typingTestButton.setInputEnabled(false);
		}

		for(var i = 0; i < englishTypingPracticeAppCount; i++) {
			var activeApp = replyJSON.EnglishAppList[i];

			var posX = this.getButtonPosX(i, englishTypingPracticeAppCount);
			var posY = this.getButtonPosY(i, englishTypingPracticeAppCount,
				TypingAppButton.BUTTON_LOWER_POS_Y
			);

			var typingTestButton = new TypingAppButton(
				TypingAppButton.TYPE_TEST_ENGLISH,
				posX, posY,
				this.getAnimalSprite(replyJSON.EnglishHighScoreList, activeApp.AppID),
				activeApp.KoreanName,
				{
					AppID: activeApp.AppID,
					AppName: activeApp.AppName,
					KoreanName: activeApp.KoreanName
				}
			);

			if(!this.hasApp(activeApp.AppID, replyJSON.EnglishActiveAppList))
				typingTestButton.setInputEnabled(false);
		}
	},

	getButtonPosX: function(index, buttonCount) {
		var gap = TypingAppButton.BUTTON_WIDTH + TypingAppButton.BUTTON_GAP;
		var maxColumnNum = Math.floor( (game.world.width - TypingAppButton.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 rowGap = TypingAppButton.BUTTON_HEIGHT + TypingAppButton.BUTTON_GAP;

		var columnGap = TypingAppButton.BUTTON_WIDTH + TypingAppButton.BUTTON_GAP;
		var maxColumnNum = Math.floor( (game.world.width - TypingAppButton.MARGIN_VERTICAL) / columnGap );
		// console.log("maxColumnNum : " + maxColumnNum);
		// console.log("buttonCount : " + buttonCount);
		var rowCount = Math.ceil(buttonCount / maxColumnNum);
		// console.log("rowCount : " + rowCount);

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

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


	downloadListFailed: function(replyJSON) {
		console.log('download app list failed, jsonData : ' + JSON.stringify(replyJSON));
	}

}