package ui;

import model.Player;
import model.Team;

import org.apache.commons.lang.StringUtils;

import dao.PlayerDao;
import dao.TeamDao;

public class UpdatePlayerUi extends AbstractUi {

	private PlayerDao playerDao;

	private TeamDao teamDao;

	public void setPlayerDao(PlayerDao dao) {
		this.playerDao = dao;
	}

	public void setTeamDao(TeamDao service) {
		this.teamDao = service;
	}

	public void show() {

		Player player = getPlayer();
		if (player == null) {
			return;
		}

		String name = getName(player);
		if (StringUtils.isNotEmpty(name)) {
			player.setName(name);
		}

		Team team = getTeam(player);
		if (team != null) {
			player.setTeam(team);
		}

		this.playerDao.updatePlayer(player);
		System.out.printf("¼±¼öID '%s'ÀÎ ¼±¼ö¸¦, ¼±¼ö¸í '%s', ÆÀ '%s'·Î ¼öÁ¤ÇÕ´Ï´Ù.%n", player.getId(), player.getName(), player.getTeam().getName());
	}

	protected Player getPlayer() {
		final String playerId = "¼±¼öID";
		// ¸Þ´º Ç¥½Ã
		showMenu(playerId);
		System.out.println("¾Æ¹«°Íµµ ÀÔ·ÂÇÏÁö ¾Ê°í Enter¸¦ ´©¸£¸é ¸Þ´º·Î µ¹¾Æ°©´Ï´Ù.");
		// ÄÜ¼Ö¿¡ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		String id = getInputedString();
		// ¹®ÀÚ¿­ÀÌ ÀÔ·ÂµÇ¾î ÀÖ´ÂÁö?
		if (StringUtils.isEmpty(id)) {
			return null;
			// ¼ýÀÚÀÎÁö?
		} else if (UiUtils.isNumeric(id, playerId)) {
			// ID·Î ¼±¼ö¸¦ °Ë»ö
			Player player = this.playerDao.getPlayer(Integer.valueOf(id));

			if (player == null) {
				// ÇØ´çÇÏ´Â ¼±¼ö°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù
				System.out.printf("ÀÔ·ÂÇÏ½Å ¼±¼öID°¡ '%s'ÀÎ ¼±¼ö´Â Á¸ÀçÇÏÁö¾Ê½À´Ï´Ù.%n", id);
				return getPlayer();
			}
			return player;
		}
		return getPlayer();
	}

	protected String getName(Player player) {
		final String playerName = "¼±¼ö¸í";
		// ¸Þ´º Ç¥½Ã
		showMenu(playerName);
		System.out.println("¾Æ¹«°Íµµ ÀÔ·ÂÇÏÁö ¾Ê°í Enter¸¦ ´©¸£¸é º¯°æµÇÁö ¾Ê½À´Ï´Ù.");
		System.out.printf("¿ø·¡°ª£º%s%n", player.getName());
		// ÄÜ¼Ö¿¡ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		String name = getInputedString();
		// ¹®ÀÚ¿­ÀÌ ÀÔ·ÂµÇ¾î ÀÖ´ÂÁö?
		if (StringUtils.isEmpty(name)) {
			return null;
		}
		// 128¹®ÀÚ ÀÌ³»ÀÎÁö?
		if (UiUtils.isSmallLength(name, playerName, 128)) {
			return name;
		}
		return getName(player);
	}

	protected Team getTeam(Player player) {
		final String teamId = "ÆÀID";
		// ¸Þ´º Ç¥½Ã
		showMenu(teamId);
		System.out.println("¾Æ¹«°Íµµ ÀÔ·ÂÇÏÁö ¾Ê°í Enter¸¦ ´©¸£¸é º¯°æµÇÁö ¾Ê½À´Ï´Ù.");
		System.out.printf("¿ø·¡°ª£º%s %s%n", player.getTeam().getId(), player.getTeam().getName());
		// ÄÜ¼Ö¿¡ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		String id = getInputedString();
		// ¹®ÀÚ¿­ÀÌ ÀÔ·ÂµÇ¾î ÀÖ´ÂÁö?
		if (StringUtils.isEmpty(id)) {
			return null;
		}
		// ¼ýÀÚÀÎÁö?
		if (UiUtils.isNumeric(id, teamId)) {
			// ID·Î ÆÀÀ» °Ë»ö
			Team team = this.teamDao.getTeam(Integer.valueOf(id));
			if (team == null) {
				// ÇØ´çÇÏ´Â ¼±¼ö°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù
				System.out.printf("ÀÔ·ÂÇÏ½Å ÆÀ¸íÀÌ '%s'ÀÎ ÆÀÀº Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.%n", id);
				return getTeam(player);
			}
			return team;
		}
		return getTeam(player);
	}

	protected void showMenu(String wanted) {
		System.out.println("--------------------");
		System.out.println("¡º¼±¼ö ¸í´Ü¡»¡¸¼±¼ö °»½Å¡¹");
		System.out.println("");
		System.out.printf("%s¸¦ ÀÔ·ÂÇÑ ÈÄ Enter¸¦ ´­·¯ÁÖ¼¼¿ä.", wanted);
	}

}
