package com.yummynoodlebar.core.domain;
import com.yummynoodlebar.events.orders.OrderDetails;
import org.springframework.beans.BeanUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
public class Order {
private final Date dateTimeOfSubmission;
private List<MenuItem> menuItems;
private final UUID key;
private Customer customer;
private OrderStatus status;
private List<OrderStatus> statusHistory;
private Date expectedCompletionTime;
private BigDecimal totalCost;
//currently 5 minutes
private final static long ACCEPT_CANCEL_TIME = 1000 * 60 * 5;
public Order(final Date dateTimeOfSubmission) {
this.key = UUID.randomUUID();
this.dateTimeOfSubmission = dateTimeOfSubmission;
statusHistory = new ArrayList<OrderStatus>();
}
public Order(final UUID key,final Date dateTimeOfSubmission) {
this.key = key;
this.dateTimeOfSubmission = dateTimeOfSubmission;
statusHistory = new ArrayList<OrderStatus>();
}
public Date getExpectedCompletionTime() {
return expectedCompletionTime;
}
public void setExpectedCompletionTime(Date expectedCompletionTime) {
this.expectedCompletionTime = expectedCompletionTime;
}
public BigDecimal getTotalCost() {
return totalCost;
}
public void setTotalCost(BigDecimal totalCost) {
this.totalCost = totalCost;
}
public void addStatus(OrderStatus newStatus) {
statusHistory.add(newStatus);
status = newStatus;
}
public OrderStatus getStatus() {
return status;
}
public Date getDateTimeOfSubmission() {
return dateTimeOfSubmission;
}
public UUID getKey() {
return key;
}
public List<MenuItem> getMenuItems() {
return menuItems;
}
public void setMenuItems(List<MenuItem> menuItems) {
this.menuItems = menuItems;
}
public boolean canBeDeleted() {
//accept cancellation if within 5 minutes of placing.
return System.currentTimeMillis() - dateTimeOfSubmission.getTime() < ACCEPT_CANCEL_TIME;
}
public Order withMenuItems(List<MenuItem> menuItems) {
this.menuItems = menuItems;
return this;
}
public OrderDetails toOrderDetails() {
OrderDetails details = new OrderDetails();
details.setDateTimeOfSubmission(getDateTimeOfSubmission());
details.setKey(getKey());
return details;
}
public static Order fromOrderDetails(OrderDetails orderDetails) {
Order order = new Order(orderDetails.getKey(),orderDetails.getDateTimeOfSubmission());
BeanUtils.copyProperties(orderDetails, order);
return order;
}
}