import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class OrderStatusControll implements ActionListener{
	
	class Order{
		// ÇÑ Å×ÀÌºíÀÇ ÁÖ¹® ÇöÈ²
		final int MAX_ORDER = 50;
		private String tableNumber;
		private String[] menu;
		private int[] price;
		private int totalPrice;
		private int numOfmenu;
		
		Order(String tableNumber)
		{
			this.tableNumber = tableNumber;
			this.menu = new String[MAX_ORDER];
			this.price = new int[MAX_ORDER];
			this.totalPrice = 0;
			this.numOfmenu = 0;
		}
		
		public boolean addMenu(String menuName, int price)
		{
			if(this.numOfmenu >= MAX_ORDER)
				return false;
			
			this.menu[this.numOfmenu] = menuName;
			this.price[this.numOfmenu] = price;
			this.totalPrice += price;
			this.numOfmenu++;
			
			return true;
		}
	
		public String getTableNumber() { return this.tableNumber; }
		
		public int getTotalPrice() { return this.totalPrice; }
		
		public int getNumOfMenu() { return this.numOfmenu; }
		
		public String[] getAllMenuName() { return this.menu; }
		
		public int[] getAllPriceEachMenu() { return this.price;	}
	}

	class TempOrder{
		private String menuName;
		private int price;
		
		TempOrder(String menuName, int price)
		{
			this.menuName = menuName;
			this.price = price;
		}
		
		public String getMenuName()
		{
			return this.menuName;
		}
		
		public int getPrice()
		{
			return this.price;
		}
		
	}
	
	private JTextArea textArea;
	private JTextField customerName;
	private JComboBox<String> tableNumber;
	private JButton orderBtn;
	private JButton cancelBtn;
	private JButton paymentBtn;
	
	private LinkedList<Order> orderList;
	private LinkedBlockingQueue<TempOrder> tempOrderQueue;
	
	private DB_Interface di;	
	
	OrderStatusControll(JTextArea textArea, JTextField customerName, JComboBox<String> tableNumber, 
			JButton orderBtn, JButton cancelBtn, JButton paymentBtn)
	{
		// textArea´Â ¸®½º³Ê µî·Ï ¸øÇÔ. ³ª¸ÓÁö´Â ¸®½º³Ê µî·Ï ok
		this.textArea = textArea;
		this.customerName = customerName;
		this.tableNumber = tableNumber;
		this.orderBtn = orderBtn;
		this.cancelBtn = cancelBtn;
		this.paymentBtn = paymentBtn;		
		
		orderList = new LinkedList<Order>();
		tempOrderQueue = new LinkedBlockingQueue<TempOrder>();
		
		System.out.println("OrderStatus Controller »ý¼º ¿Ï·á..");
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == this.tableNumber){
			
			//¸Þ´º¸¦ Ãß°¡ÇÏ´Â µµÁß ÄÞº¸¹Ú½º¿¡¼­ ÀÌº¥Æ®°¡ ¹ß»ýÇÏ¸é Å¥¸¦ ºñ¿ì°í
			//ÅØ½ºÆ®areaµµ ÃÊ±âÈ­
			this.tempOrderQueue.clear();
			this.textArea.setText("");
			selectTableNumber(e);
			
		}else if(e.getSource() == this.orderBtn){
			
			setOrder();
			
		}else if(e.getSource() == this.cancelBtn){
			
			cancelOrder();
			
		}else if(e.getSource() == this.paymentBtn){
			
			String selectedTableNumber = (String)this.tableNumber.getSelectedItem();
			if(di.isTurnedOn(selectedTableNumber))
				paymentOrder();				
			
		}		
	}
	
	private Order findOrder(String tableNumber){ 
		Order order = null;
		
		ListIterator<Order> iterator = orderList.listIterator();				
		while(iterator.hasNext())
		{
			order = iterator.next();
			if(order.getTableNumber().equals(tableNumber))
				break;
		}
		
		return order;
	}
	
	private void setOrder()
	{
		String selectedTableNumber = (String) this.tableNumber.getSelectedItem();
		Order order = null;
		TempOrder tempOrder;
		int tempQueLength = this.tempOrderQueue.size();
		
		if(tempQueLength == 0)
		{
			// ÀÓ½Ã Å¥¿¡ ÀúÀåµÈ ÁÖ¹®ÀÌ ¾ø´Ù¸é ÆË¾÷Ã¢ ¶ç¿ò.
			JOptionPane warning = new JOptionPane();
			JOptionPane.showMessageDialog(null, "¸ÕÀú Ãß°¡ÇÒ ¸Þ´º¸¦ °í¸£½Ê½Ã¿À.", "warning",
					warning.WARNING_MESSAGE);	
		}
		else
		{
			// ÀÓ½Ã Å¥¿¡ ÀúÀåµÈ ÁÖ¹®µéÀ» ÁÖ¹® ¸®½ºÆ®¿¡ ÀÖ´Â ÇØ´ç ÀÎ½ºÅÏ½º¿¡ Ãß°¡.
			// ¼±ÅÃµÈ Å×ÀÌºíÀÇ Ã¹ ÁÖ¹® ½Ã, »õ·Î¿î ÁÖ¹® ÀÎ½ºÅÏ½º¸¦ ¸¸µé°í, Ãß°¡.
			
			if(di.isTurnedOn(selectedTableNumber)){
				
				// ±âÁ¸¿¡ ÀÖ´ø Å×ÀÌºí¿¡ Ãß°¡ ÁÖ¹®ÇÏ´Â °Å¶ó¸é
				order = findOrder(selectedTableNumber);
				
				// ÀÓ½Ã Å¥ÀÇ ÁÖ¹® ÀÎ½ºÅÏ½º¸¦ order¿¡ Ãß°¡.
				
				for(int i = 0; i < tempQueLength; i++)
				{
					tempOrder = this.tempOrderQueue.poll();
					order.addMenu(tempOrder.getMenuName(), tempOrder.getPrice());					
				}			
				
			}
			else
			{			
				// »õ·Î¿î Å×ÀÌºíÀÇ Ã¹ ÁÖ¹®ÀÌ¶ó¸é
				
				order = new Order(selectedTableNumber);		
				
				for(int i = 0; i < tempQueLength; i++)
				{
					tempOrder = this.tempOrderQueue.poll();					
					order.addMenu(tempOrder.getMenuName(), tempOrder.getPrice());					
				}// end for
				
				orderList.add(order);
			}
			// textAreaÃÊ±âÈ­. ÁÖ¹®¿Ï·áµÈ »óÅÂ·Î ÀçÃâ·Â
			textArea.setText("");
			showOrderStatusOnTextArea(order);
			textArea.append("\n\n====================\n");
			textArea.append("ÃÑ ±Ý¾×" + "\t" 
					+ Integer.toString(order.getTotalPrice()));
			di.setTableTurnOn(selectedTableNumber);
		}
		
		
	}
	
	private void selectTableNumber(ActionEvent e)
	{
		
		Order order = null;
		JComboBox<String> cb = (JComboBox<String>) e.getSource();
		String selectedTableNumber = (String) cb.getSelectedItem();
		
		// tablenumber¿¡ ÁÖ¹®ÀÌ µé¾î°£ »óÅÂ¶ó¸é, ÄÁÅÙÃ÷¸¦ ÅØ½ºÆ® area¿¡ Ãâ·Â		
		if(di.isTurnedOn(selectedTableNumber))
		{
			
			order = findOrder(selectedTableNumber);
			showOrderStatusOnTextArea(order);
			textArea.append("\n\n====================\n");
			textArea.append("ÃÑ ±Ý¾×" + "\t" + Integer.toString(order.getTotalPrice()));
		}		
	}
	
	private void showOrderStatusOnTextArea(Order order)
	{
		//order ÀÎ½ºÅÏ½º ³»ÀÇ ¸ðµç ÁÖ¹® ÇöÈ²À» testArea¿¡ Ãâ·Â
		if(order == null)
			return;
		
		String newStr;
		String[] menuName = order.getAllMenuName();
		int[] price = order.getAllPriceEachMenu();
		
		for(int i = 0; i < order.numOfmenu; i++){
			newStr = "";
			newStr += menuName[i];
			newStr += "\t";
			newStr += Integer.toString(price[i]);
			textArea.append(newStr+"\n");
		}
	}

	private void cancelOrder()
	{
		Order order = null;
		String selectedTableNumber = (String)this.tableNumber.getSelectedItem();
		
		// ÇöÀç ¼±ÅÃµÈ Å×ÀÌºí ÁÖ¹®ÇöÈ² ÀÎ½ºÅÏ½º Ã£±â
		order = findOrder(selectedTableNumber);
		
		if(this.tempOrderQueue.size() == 0 && order != null){
			// ÀÓ½Ã ÁÖ¹®ÀÌ ¾ø´Â °æ¿ì, ÇöÀç Å×ÀÌºíÀÇ ¸ðµç ÁÖ¹®À» Ãë¼Ò.
			// Ãë¼ÒÇÏ±â Àü¿¡ ÆË¾÷Ã¢À¸·Î È®ÀÎÀ» ¹ÞÀ½.
			
			JOptionPane optionPane = new JOptionPane();
			int dialogResult = JOptionPane.showConfirmDialog(null, 
					String.format("%d¹ø Å×ÀÌºíÀÇ ¸ðµç ÁÖ¹®À» Ãë¼ÒÇÏ½Ã°Ú½À´Ï±î?", 
							Integer.parseInt(selectedTableNumber)));
			if(dialogResult == JOptionPane.YES_OPTION){
				
				// ¼±ÅÃµÈ Å×ÀÌºíÀÇ ¸ðµç ÁÖ¹® Ãë¼Ò.
				this.orderList.remove(order);
				di.setTableTurnOff(selectedTableNumber);	
				textArea.setText("");
			}			
		}else if(this.tempOrderQueue.size() > 0){
			textArea.setText("");
			
			if(order != null)
			{
				// ÀÓ½Ã ÁÖ¹® Å¥¿¡ ÀÎ½ºÅÏ½º°¡ ÀÖ´Ù¸é ±×°Í¸¸ »èÁ¦
				textArea.setText("");
				showOrderStatusOnTextArea(order);
				textArea.append("\n\n====================\n");
				textArea.append("ÃÑ ±Ý¾×" + "\t" 
						+ Integer.toString(order.getTotalPrice()));
			}
			
			this.tempOrderQueue.clear();
		}
	}
		
	private void paymentOrder()
	{		
		
		String selectedTableNumber;
		String custName;
		String query;
		String[] allMenu;
		Order order = null;
		ResultSet rs = null;
		int id=0;
		int totalPurchasingPrice=0;
	
		String curLoginName = di.getCurrentIDConnectedToDB();
		query = "select count(*) from employee where name = '"
				+ curLoginName
				+ "'";
		rs = di.executeQuery(query);
		try {
			rs.next();
			if(rs.getInt("count(*)") != 1)
			{
				JOptionPane warning = new JOptionPane();
				warning.showMessageDialog(null, "°áÁ¦´Â Á÷¿ø ·Î±×ÀÎ ÈÄ °¡´ÉÇÕ´Ï´Ù.", "warning",
						warning.WARNING_MESSAGE);
				di.closeStatementResultSet();
				return;
			}
		} catch (SQLException e1) {
			di.closeStatementResultSet();
			e1.printStackTrace();
		}
		di.closeStatementResultSet();		
		
		selectedTableNumber = (String)this.tableNumber.getSelectedItem();
		custName = this.customerName.getText();
		order = findOrder(selectedTableNumber);
		allMenu = order.getAllMenuName();
		
		if(custName.equals(""))
		{
			custName = "ºñÈ¸¿ø";
		}
		else{
			// DB¿¡ µî·ÏµÈ È¸¿øÀÎÁö Ã¼Å©
			query = "select count(*) from customer where name = '"
					+ custName
					+ "'";
			
			rs = di.executeQuery(query);
			try {
				rs.next();
				
				if(rs.getInt("count(*)") == 0)
				{
					JOptionPane warning = new JOptionPane();
					warning.showMessageDialog(null, "µî·ÏµÇÁö ¾ÊÀº È¸¿øÀÔ´Ï´Ù.", "warning",
							warning.WARNING_MESSAGE);
					di.closeStatementResultSet();
					return;
				}
				
			} catch (SQLException e) {
				System.out.println(e.getMessage());
				e.printStackTrace();
			}			
		}		
		di.closeStatementResultSet();
		
		rs = di.getTPPAndIdFromDB(custName);
		
		try {			
			rs.next();
			id = rs.getInt("id");
			totalPurchasingPrice = rs.getInt("total_purchasing_price");			
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}finally
		{
			di.closeStatementResultSet();
		}
		
		Calendar cal = Calendar.getInstance();

		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		int minute = cal.get(Calendar.MINUTE);
		
		// order ÀÎ½ºÅÏ½º ³»ÀÇ ¸ðµç ³»¿ªÀ» Sales Å×ÀÌºí¿¡ »ðÀÔ
		for(int i=0 ;i<order.getNumOfMenu(); i++)
		{
			di.insertTupleToSales(id, custName, allMenu[i], year, month, day,
									hour, minute);
		}		
		
		// employee tableÀÇ total_performance ¾÷µ¥ÀÌÆ®
		String currentIDConnectedToDB = di.getCurrentIDConnectedToDB();
		int total_performance;
		
		query = "select count(*) from employee where name = '"
				+ currentIDConnectedToDB
				+ "'";
		rs =  di.executeQuery(query);
		try {
			
			rs.next();
			
			if(rs.getInt("count(*)") != 0)
			{
				di.closeStatementResultSet();

				query = "select total_performance from employee where name = '"
						+ currentIDConnectedToDB + "'";
				rs = di.executeQuery(query);

				rs.next();
				total_performance = rs.getInt("total_performance") + order.getTotalPrice();
				di.closeStatementResultSet();
				di.updateTotalPerformance(total_performance);				
			}
			
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		
		
		// µî±Þ¿¡ µû¶ó ÇÒÀÎÀ² Àû¿ëÇÏ¿©, ÃÑ±¸¸Å±Ý¾×¿¡ ÇÕ»ê
		if(totalPurchasingPrice >= 1000000)
			totalPurchasingPrice += (int)((double)order.getTotalPrice()*0.7);
		else if(totalPurchasingPrice >= 500000 )
			totalPurchasingPrice += (int)((double)order.getTotalPrice()*0.8);
		else if(totalPurchasingPrice >= 300000)
			totalPurchasingPrice += (int)((double)order.getTotalPrice()*0.9);
		else 
			totalPurchasingPrice += order.getTotalPrice();		
		
		di.updateTotalPurchasingPrice(custName, totalPurchasingPrice);
		
		// ÃÑ±¸¸Å±Ý¾×¿¡ µû¶ó¼­ µî±Þ Á¶Á¤
		if (!custName.equals("ºñÈ¸¿ø")) {
			
			if (totalPurchasingPrice >= 1000000)
				di.updateGrade(custName, "Gold");
			else if (totalPurchasingPrice >= 500000)
				di.updateGrade(custName, "Silver");
			else if (totalPurchasingPrice >= 300000)
				di.updateGrade(custName, "Bronze");
		}
		
		
		
		di.setTableTurnOff(selectedTableNumber);
		orderList.remove(order);
		textArea.setText("");
		
		JOptionPane warning = new JOptionPane();
		warning.showMessageDialog(null, "°áÁ¦µÇ¾ú½À´Ï´Ù.", "°áÁ¦¿Ï·á",
				warning.DEFAULT_OPTION);

	}
	
	public void setTemporaryOrder(String menuName, int price)
	{	
		// ÀÎÀÚ·Î ¹ÞÀº menuName°ú price´Â ¸Þ´º ÄÁÆ®·Ñ·¯·ÎºÎÅÍ ¹ÞÀ½.
		// ÁÖ¹®¹öÆ° ´©¸£±â Àü±îÁö´Â ÀÓ½Ã Å¥¿¡ ÁÖ¹®À» ÀúÀå.
		
		//String selectedTableNumber = (String) this.tableNumber.getSelectedItem();
		TempOrder tempOrder = new TempOrder(menuName, price);
		this.tempOrderQueue.add(tempOrder);		
	
		String str = "\n+" + menuName + "\t" + Integer.toString(price);
		textArea.append(str);		
	}	
	
	public void setDBInterface(DB_Interface di)
	{
		this.di = di;
	}		
}
