package ui;

import java.util.List;

import model.Reservation;
import model.Ticket;
import model.User;

import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Transactional;

import dao.ReservationDao;
import dao.TicketDao;
import dao.UserDao;

public class InsertReservationUi extends AbstractUi {

	private TicketDao ticketDao;

	private UserDao userDao;

	private ReservationDao reservationDao;

	public void setTicketDao(TicketDao ticketDao) {
		this.ticketDao = ticketDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void setReservationDao(ReservationDao reservationDao) {
		this.reservationDao = reservationDao;
	}

	@Transactional
	public void show() {
		// Çì´õ¸¦ Ç¥½Ã
		showHeader();
		// ÄÜ¼Ö¿¡ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		Integer rankId = getNumber();
		if (rankId == null) {
			return;
		}
		// ¸Þ´º¸¦ Ç¥½Ã
		showMenu("Æ¼ÄÏ ¸Å¼ö");
		System.out.println("¾Æ¹«°Íµµ ÀÔ·ÂÇÏÁö ¾Ê°í Enter¸¦ ´©¸£¸é ¸Þ´º·Î µ¹¾Æ°©´Ï´Ù.");
		// ÄÜ¼Ö¿¡ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		Integer quantity = getNumber();
		if (quantity == null) {
			return;
		}
		// ·©Å© ID·Î ³²¾ÆÀÖ´Â Æ¼ÄÏ ¸Å¼ö¸¦ °Ë»ö
		List<Ticket> ticketList = this.ticketDao.getNotBookedTicketList(rankId, quantity);
		if (ticketList == null) {
			// ÇØ´çÇÏ´Â Æ¼ÄÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ½
			System.out.println("ÀÔ·ÂµÈ IDÀÎ ·©Å©ÀÇ Æ¼ÄÏÀº ¾ø½À´Ï´Ù. ´Ù½Ã ÇÑ¹ø ÀÔ·ÂÇØÁÖ¼¼¿ä.");
			show();
			return;
		}

		if (ticketList.size() < quantity.intValue()) {
			// Æ¼ÄÏÀÌ ÀÔ·ÂµÈ ¸Å¼ö¸¸Å­ ³²¾ÆÀÖÁö ¾Ê´Ù
			System.out.println("Æ¼ÄÏÀÌ ÀÔ·ÂµÈ ¸Å¼ö¸¸Å­ ³²¾ÆÀÖÁö ¾Ê½À´Ï´Ù. ´Ù½Ã ÇÑ¹ø ÀÔ·ÂÇØ ÁÖ¼¼¿ä.");
			show();
			return;
		}
		// ¸Þ´º¸¦ Ç¥½Ã
		showMenu("ÀÌ¸§");
		// ÄÜ¼Ö¿¡ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		String name = getInputedString();
		// ¹®ÀÚ¿­ÀÌ ÀÔ·ÂµÇ¾ú´ÂÁö?
		if (StringUtils.isBlank(name)) {
			return;
		}
		// À¯Àú¸íÀ¸·Î À¯Àú¸¦ °Ë»ö
		User user = this.userDao.getUser(name);
		if (user == null) {
			// ½Å±Ô À¯Àú¸¦ »ý¼º
			user = new User();
			user.setName(name);
			this.userDao.addUser(user);
		}
		// ¿¹¾à Ã³¸®¸¦ ½ÇÇà
		reserve(ticketList, user);
	}

	protected void reserve(List<Ticket> ticketList, User user) {
		
		for (Ticket ticket : ticketList) {
			// ½Å±Ô ¿¹¾àÀ» »ý¼º
			Reservation reservation = new Reservation();
			reservation.setReservationId(ticket.getTicketId());
			reservation.setTicket(ticket);
			reservation.setUser(user);

			// µ¥ÀÌÅÍº£ÀÌ½º¿¡ ¿¹¾àÀ» µî·Ï
			this.reservationDao.addReservation(reservation);
		}
	}

	protected Integer getNumber() {
		// ÄÜ¼Ö¿¡ ÀÔ·ÂµÈ °ªÀ» Ãëµæ
		String number = getInputedString();
		// ¹®ÀÚ¿­ÀÌ ÀÔ·ÂµÇ¾ú´ÂÁö?
		if (StringUtils.isBlank(number)) {
			return null;
		}
		// ¼ýÀÚÀÎÁö?
		if (StringUtils.isNumeric(number)) {
			return Integer.valueOf(number);
		}
		System.out.println("¼ýÀÚ·Î ÀÔ·ÂÇØÁÖ¼¼¿ä.");

		return getNumber();
	}

	protected void showHeader() {
		System.out.println("--------------------");
		System.out.println("¡ºÆ¼ÄÏ ¿¹¾à¡»¡¸Æ¼ÄÏ¡¹");
		System.out.println("");
		showMenu("¿¹¾àÇÏ°í ½ÍÀº Æ¼ÄÏÀÇ ID");
		System.out.println("¾Æ¹«°Íµµ ÀÔ·ÂÇÏÁö ¾Ê°í Enter¸¦ ´©¸£¸é ¸Þ´º·Î µ¹¾Æ°©´Ï´Ù.");
	}

	protected void showMenu(String wanted) {
		System.out.printf("%s¸¦ ÀÔ·ÂÇÑ ÈÄ Enter¸¦ ´­·¯ÁÖ¼¼¿ä.%n", wanted);
	}
}
