class Table{
  
  TableState{
    
    Available{
      
      placeOrder(java.sql.Date date, Table... tables)/{
        RestoApp restoApp = getRestoApp();
        Order newOrder = new Order(date, restoApp, tables);
        //call the table function
        addOrder(newOrder);
        //record the time when switching state 
      }  -> InUse;
      
      reserve(Reservation newReservation)/{
        addReservation(newReservation);
      } -> Available;
      
      cancelReservation(Reservation aReservation) [!ReservationListAlmostEmpty()]/{
        //TODO
       
      } -> Available; 
      
    }
    
    InUse{
      
      payBill()/{
        //TODO
      } -> Available;
      
      
      cancelOrder()/{
        int index = numberOfOrders();
        Order theLastOrder = getOrder(index -1);
        removeOrder(theLastOrder);
        //reset the start time when becoming available 
         
      } ->Available;
      
      //the logic for managing order items will be left in the controller
      
      reserve(Reservation newReservation) /{
        //The multiple reservation conflicts that could occur will have to be
        //oversighted by the waiter. 
        addReservation(newReservation);
      } -> InUse;
      
      cancelReservation(Reservation aReservation)[!ReservationListAlmostEmpty()]/{
        //TODO 
      } -> InUse; 
      
    }
    
    
    
  }//end of state machine
 
  
  
  private boolean orderItemsInOrderIsEmpty(){
    
    int currentNumOfOrders = numberOfOrders();
    Order currentOrder = getOrder(currentNumOfOrders -1);
    return currentOrder.numberOfOrderItems() == 0;
  }
  
  private boolean iscurrentReservationdate(Date date){
    
    Date currentReservationDate = getReservation(0).getDateTime();
    int result = date.compareTo(currentReservationDate);
    if( result == 0) return true;
    else return false;
  }
  
   private boolean ReservationListAlmostEmpty(){
    
    return numberOfReservations() == 1;
    
  }
  
 
}