class Table {
   status {
      Available {
         startOrder() / {
            new Order(new java.sql.Date(Calendar.getInstance().getTime().getTime()), new java.sql.Time(Calendar.getInstance().getTime().getTime()), this.getRestoApp(), this);
         } -> NothingOrdered;
         addToOrder(Order o) / {
            o.addTable(this);
         } -> NothingOrdered; 
      }
      NothingOrdered {
         orderItem(int quantity, Order o, Seat s, PricedMenuItem i) [quantityIsPositive(quantity)] / {
            // create a new order item with the provided quantity, order, seat, and priced menu item
         } -> Ordered; 
         addToOrderItem(OrderItem i, Seat s) / {
            // add provided seat to provided order item unless seat has already been added, in which case nothing needs to be done
         } -> Ordered;
         endOrder(Order o) / {
            if (!o.removeTable(this)) {
               if (o.numberOfTables() == 1) {
                  o.delete();
               }
            }
         } -> Available;
      }
      Ordered {
         orderItem(int quantity, Order o, Seat s, PricedMenuItem i) [quantityIsPositive(quantity)] / {
            // create a new order item with the provided quantity, order, seat, and priced menu item
         } -> Ordered; 
         addToOrderItem(OrderItem i, Seat s) / {
            // add provided seat to provided order item unless seat has already been added, in which case nothing needs to be done
         } -> Ordered;
         cancelOrderItem(OrderItem i) [iIsLastItem(i)] / {
            // delete order item
         } -> NothingOrdered;
         cancelOrderItem(OrderItem i) [!iIsLastItem(i)] / {
            // delete order item
         } -> Ordered;
         cancelOrder() / {
            // delete all order items of the table
         } -> NothingOrdered;
         billForSeat(Order o, Seat s) / {
            // create a new bill with the provided order and seat; if the provided seat is already assigned to
            // another bill for the current order, then the seat is first removed from the other bill and if no seats
            // are left for the bill, the bill is deleted
         } -> Ordered;
         addToBill(Bill b, Seat s) / {
            // add provided seat to provided bill unless seat has already been added, in which case nothing needs
            // to be done; if the provided seat is already assigned to another bill for the current order, then the
            // seat is first removed from the other bill and if no seats are left for the bill, the bill is deleted
         } -> Ordered;
         endOrder(Order o) [allSeatsBilled()] / {
         } -> Available;
      }
   }
   
   // check that the provided quantity is an integer greater than 0
   private boolean quantityIsPositive(int quantity) {
      boolean positive = quantity > 0;
      return positive;
   }

   // check that the provided order item is the last item of the current order of the table
   private boolean iIsLastItem(OrderItem i) {
      // TODO
      return false;
   }

   // check that all seats of the table have a bill that belongs to the current order of the table 
   private boolean allSeatsBilled() {
	   boolean billed= true;
	   Order curOrder =this.getOrder(this.numberOfOrders()-1);
	   List <Seat> curSeats = this.getCurrentSeats();
	   List <Seat> seatsWithOrderItems = new ArrayList<Seat>();
	   List<OrderItem> orderItems= curOrder.getOrderItems();
	   for (Seat s: curSeats){ //for every current seat at the table
	   		for( OrderItem i :orderItems){ //for every orderItem in Order of table 
	   			if (s.getOrderItems().contains(i)){  //if seat's orderedItems contain an orderItem from the table's order
	   				seatsWithOrderItems.add(s); // add seat to seatsWithOrderItems
	   			}
	   		}
	   	} 
	   List<Bill> billsOfCurOrder = curOrder.getBills(); //bills that belong to current order
	   for(Seat s :seatsWithOrderItems){ //for each seat that ordered somethings
	   		boolean seatBilled=false;
	     	List<Bill> seatBills= s.getBills();
	     	for(Bill sb : seatBills){ //for each bill in seat bills
		        	if (billsOfCurOrder.contains(sb)){  //if billsOfCurOrder contains this seat's bill
		         		seatBilled= true;         // then the seat is billed
		         		break; //break out of this seat's bills loop
		        	}                
	    		}
	    		//if after going through each seat's bill, none of them were contained in billsOfCurOrder, 
	    		//that means this seat has order items not billed yet, so must return false for billed
	    		if (seatBilled ==false){ 
	        		billed=false;
	         		break;
	    		}      
	   }
	   return billed;
   }

}
