import java.util.*;
public class SnackBar
{
  // Only one KeyboardInput object needs to be created. It can be
  // shared amongst the methods by storing a reference to it in
  // an instance variable.
  private KeyboardInput in;
  // The menu used by an instance of this class.
  private Menu menu;
  // The order list
  private OrderList orderList;
  public SnackBar()
  {
    in = new KeyboardInput();
    menu = new Menu();
    orderList = new OrderList();
  }
  /**
   * The main loop of the program. Keep asking the user to enter
   * a command number until the user quits.
   */
  public void go()
  {
    while (true)
    {
      displayCommands();
      int command = getCommand();
      if (quitSelected(command))
      {
        break;
      }
      runCommand(command);
    }
  }
  private void displayCommands()
  {
    System.out.println("\nSnack Bar");
    System.out.println("1. Display Menu");
    System.out.println("2. Add Menu Item");
    System.out.println("3. Remove Menu Item");
    System.out.println("4. Change Price of Menu Item");
    System.out.println("5. Save Menu");
    System.out.println("6. Load Menu");
    System.out.println("7. Enter Order");
    System.out.println("8. Display Order");
    System.out.println("9. Quit");
  }
  private int getCommand()
  {
    System.out.print("\nSelect command: ");
    return in.readInteger();
  }
  private boolean quitSelected(int n)
  {
    return (n == 9)? true : false;
  }
  private void runCommand(int item)
  {
    switch (item)
    {
      case 1:
        displayMenu();
        break;
      case 2:
        addMenuItem();
        break;
      case 3:
        removeMenuItem();
        break;
      case 4:
        changePrice();
        break;
      case 5:
        saveMenu();
        break;
      case 6:
        loadMenu();
        break;
      case 7:
        enterOrder();
        break;
      case 8:
        displayOrder();
        break;
      default:
        System.out.println("\nSorry - don't recognise that input, try again");
    }
  }
  /**
   * Display the food menu.
   */
  private void displayMenu()
  {
    System.out.println("Snack Bar Menu");
    System.out.println("--------------");
    ArrayList items = menu.getMenuItems();
    for (int i = 0; i < items.size(); i++)
    {
      MenuItem item = (MenuItem) items.get(i);
      System.out.println((i + 1) + ". " + item.getName() + "\t\t"
                         + item.getPrice());
    }
  }
  private void addMenuItem()
  {
    System.out.println("\nAdd Menu Item");
    System.out.print("Name: ");
    String name = in.readString();
    System.out.print("Price (in pence): ");
    int price = in.readInteger();
    menu.addItem(name, price);
  }
  private void removeMenuItem()
  {
    displayMenu();
    ArrayList items = menu.getMenuItems();
    int toRemove = 0;
    System.out.print("Enter number of menu item to remove: ");
    toRemove = in.readInteger();
    if ((toRemove > 0) && (toRemove <= items.size()))
    {
      menu.removeItem(toRemove - 1);
    }
    else
    {
      System.out.println("Invalid item number, nothing done");
    }
  }
  private void changePrice()
  {
    displayMenu();
    ArrayList items = menu.getMenuItems();
    int toChange = 0;
    System.out.print("Enter number of menu item to change price of: ");
    toChange = in.readInteger();
    if ((toChange > 0) && (toChange <= items.size()))
    {
      System.out.println("Enter new price: ");
      int newPrice = in.readInteger();
      menu.changeItemPrice(toChange - 1, newPrice);
    }
    else
    {
      System.out.println("Invalid item number, nothing done");
    }
  }
  private void saveMenu()
  {
    System.out.print("Enter file name: ");
    String fileName = in.readString();
    FileOutput output = new FileOutput(fileName);
    menu.save(output);
    output.close();
  }
  private void loadMenu()
  {
    System.out.print("Enter file name: ");
    String fileName = in.readString();
    FileInput input = new FileInput(fileName);
    menu.load(input);
    input.close();
  }
  private void enterOrder()
  {
    System.out.println("\nNew Order");
    System.out.println("---------");
    Order order = enterOrderItems();
    orderList.addOrder(order);
  }
  private Order enterOrderItems()
  {
    Order order = new Order();
    ArrayList items = menu.getMenuItems();
    while (true)
    {
      displayMenu();
      System.out.print("Enter menu item number or press ENTER only to stop: ");
      int menuitem = in.readInteger();
      if (menuitem == 0)
      {
        break;
      }
      if ((menuitem > 0) && (menuitem <= items.size()))
      {
        order.addOrderItem((MenuItem) items.get(menuitem - 1));
      }
    }
    return order;
  }
  private void displayOrder()
  {
    ArrayList orders = orderList.getOrders();
    if (orders.size() == 0)
    {
      System.out.println("There are no orders");
    }
    else
    {
      System.out.println("There are " + orders.size() + " orders");
      System.out.println("numbered from 1 to " + orders.size());
      System.out.print("Enter number of order to display: ");
      int orderNumber = in.readInteger();
      if ((orderNumber > 0) && (orderNumber <= orders.size()))
      {
        Order order = (Order) orders.get(orderNumber - 1);
        displayOrderItems(order);
      }
    }
  }
  private void displayOrderItems(Order order)
  {
    System.out.println("Order contains:");
    ArrayList orderItems = order.getOrderItems();
    for (int i = 0; i < orderItems.size(); i++)
    {
      MenuItem item = (MenuItem) orderItems.get(i);
      System.out.println(item.getName() + "\t\t" + item.getPrice());
    }
    System.out.println("Total: " + order.getTotal());
  }
  // The main method is as simple as possible, just creating
  // a PhoneBook object and calling its go method.
  public static void main(String[] args)
  {
    SnackBar snackBar = new SnackBar();
    snackBar.go();
  }
}