package com.starbucks.ws;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
public class Order {
private static final Random rand = new Random();
private static final Map<String, Double> priceList = new HashMap<String, Double>();
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
private static final NumberFormat currencyFormat = new DecimalFormat("#.##");
private String orderId;
private String drinkName;
private String additions;
private double cost;
private boolean locked;
private long timestamp;
public Order(String drinkName, String additions) {
this.orderId = UUID.randomUUID().toString();
this.drinkName = drinkName;
this.additions = additions;
this.cost = calculateCost();
this.timestamp = System.currentTimeMillis();
}
public String getOrderId() {
return orderId;
}
public String getDrinkName() {
return drinkName;
}
public void setDrinkName(String drinkName) {
this.drinkName = drinkName;
this.cost = calculateCost();
this.timestamp = System.currentTimeMillis();
}
public String getAdditions() {
return additions;
}
public void setAdditions(String additions) {
this.additions = additions;
this.cost = calculateCost();
this.timestamp = System.currentTimeMillis();
}
public String getCost() {
return currencyFormat.format(cost);
}
public boolean isLocked() {
return locked;
}
public void setLocked(boolean locked) {
this.locked = locked;
}
public String getTimestamp() {
return dateFormat.format(new Date(timestamp));
}
boolean isAmountAcceptable(double amount) {
return amount >= cost;
}
private double calculateCost() {
double cost = getPrice(drinkName, false);
if (additions != null && !"".equals(additions)) {
String[] additionalItems = additions.split(" ");
for (String item : additionalItems) {
cost += getPrice(item, true);
}
}
return Double.parseDouble(currencyFormat.format(cost));
}
private double getPrice(String item, boolean addition) {
synchronized (priceList) {
Double price = priceList.get(item);
if (price == null) {
if (addition) {
price = rand.nextDouble() * 5;
} else {
price = rand.nextInt(8) + 2 - 0.01;
}
priceList.put(item, price);
}
return price;
}
}
}