package ui;

import model.User;

import org.apache.commons.lang.StringUtils;

import dao.UserDao;

public class UpdateUserUi extends AbstractUi {

	private UserDao userDao;

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void show() {
		// Çì´õ¸¦ Ç¥½Ã
		showHeader();
		// ÄÜ¼Ö¿¡¼­ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		Integer id = getUserId();
		if (id == null) {
			return;
		}
		// ID·Î À¯Àú¸¦ °Ë»ö
		User user = this.userDao.getUser(id);
		if (user == null) {
			// ÇØ´çÇÏ´Â À¯Àú°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù
			System.out.printf("ÀÔ·ÂµÈ À¯Àú ID '%s'´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.%n", id);
			show();
			return;
		}
		// À¯Àú Á¤º¸¸¦ Ç¥½Ã
		showUser(user);
		// ÄÜ¼Ö¿¡¼­ ÀÔ·ÂµÈ °ªÀ» Ç¥½Ã
		String name = getName();
		// ¹®ÀÚ¿­ÀÌ ÀÔ·ÂµÇ¾î ÀÖ´ÂÁö?
		if (StringUtils.isBlank(name)) {
			return;
		}
		// À¯Àú¸í ÁöÁ¤
		user.setName(name);
		// µ¥ÀÌÅÍº£ÀÌ½º¸¦ °»½Å
		this.userDao.updateUser(user);
	}

	protected Integer getUserId() {

		final String userId = "À¯ÀúID";
		// ¸Þ´º¸¦ Ç¥½Ã
		showMenu(userId);
		// ÄÜ¼Ö¿¡¼­ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		String id = getInputedString();
		// ¹®ÀÚ¿­ÀÌ ÀÔ·ÂµÇ¾î ÀÖ´ÂÁö?
		if (StringUtils.isBlank(id)) {
			return null;
		}
		// ¼ýÀÚÀÎÁö?
		if (UiUtils.isNumeric(id, userId)) {
			return new Integer(id);
		}

		return getUserId();
	}

	protected String getName() {

		showMenu("»õ·Î¿î À¯Àú¸í");
		// ÄÜ¼Ö¿¡¼­ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		String newName = getInputedString();
		// 128¹®ÀÚ ÀÌ³»ÀÎÁö?
		if (!UiUtils.isSmallLength(newName, "À¯Àú¸í", 128)) {
			return getName();
		}

		return newName;
	}

	protected void showUser(User user) {
		System.out.println("--------------------");
		System.out.println("¡ºÆ¼ÄÏ ¿¹¾à¡»¡¸À¯Àú Á¤º¸ º¯°æ¡¹");
		System.out.println("ID    ÀÌ¸§");
		System.out.printf("%s  %s%n", user.getUserId(), user.getName());
	}

	protected void showHeader() {
		System.out.println("--------------------");
		System.out.println("¡ºÆ¼ÄÏ ¿¹¾à¡»¡¸À¯Àú Á¤º¸ º¯°æ¡¹");
		System.out.println("");
	}

	protected void showMenu(String wanted) {
		System.out.printf("%s¸¦ ÀÔ·ÂÇÑ ÈÄ Enter¸¦ ´­·¯ÁÖ¼¼¿ä.%n", wanted);
		System.out.println("¾Æ¹«°Íµµ ÀÔ·ÂÇÏÁö ¾Ê°í Enter¸¦ ´©¸£¸é ¸Þ´º·Î µ¹¾Æ°©´Ï´Ù.");
	}
}