package com.restbucks.ordering.activities;

import com.restbucks.ordering.domain.Identifier;
import com.restbucks.ordering.domain.Order;
import com.restbucks.ordering.domain.OrderStatus;
import com.restbucks.ordering.repositories.OrderRepository;
import com.restbucks.ordering.representations.OrderRepresentation;

public class UpdateOrderActivity {
    public OrderRepresentation update(OrderRepresentation order, String id) {
        Identifier orderIdentifier = new Identifier(id);
        // System.out.println("UpdateOrderActivity: id = " +id);
        String idFromOrder = order.getId();
        // if order's id is there, but doesn't *match* URI's id, fail 
        if (idFromOrder != null &&!idFromOrder.equals(id)) {
        	// System.out.println("UpdateOrderActivity: saw order with id = " + idFromOrder + " coming to uri = /order/" + id);
        	throw new InvalidOrderException(); 
        }
        OrderRepository repository = OrderRepository.current();
        if (OrderRepository.current().orderNotPlaced(orderIdentifier)) { // Defensive check to see if we have the order
            throw new NoSuchOrderException();
        }

        if (!orderCanBeChanged(orderIdentifier)) {
            throw new UpdateException();
        }

        Order storedOrder = repository.get(orderIdentifier);
        
        storedOrder.setStatus(storedOrder.getStatus());
        storedOrder.calculateCost();


        return new OrderRepresentation(storedOrder, id); 
    }
    
    private boolean orderCanBeChanged(Identifier identifier) {
        return OrderRepository.current().get(identifier).getStatus() == OrderStatus.PREPARING;
    }
}
