// Path: cqrs-lib/src/main/java/se/citerus/cqrs/bookstore/command/CommandBus.java
// public interface CommandBus {
// 
//   void dispatch(Command command);
// 
//   <T extends CommandHandler> T register(T handler);
// 
// }
// 
// Path: order-context-parent/order-command/src/main/java/se/citerus/cqrs/bookstore/ordercontext/api/CartDto.java
// public class CartDto {
// 
//   @NotEmpty
//   @Pattern(regexp = ID_PATTERN)
//   public String cartId;
// 
//   @Min(1)
//   public long totalPrice;
// 
//   @Min(1)
//   public int totalQuantity;
// 
//   @NotNull
//   @NotEmpty
//   public List<LineItemDto> lineItems;
// 
// }
// 
// Path: order-context-parent/order-command/src/main/java/se/citerus/cqrs/bookstore/ordercontext/api/LineItemDto.java
// public class LineItemDto {
// 
//   @NotEmpty
//   @Pattern(regexp = ID_PATTERN)
//   public String productId;
// 
//   @NotNull
//   public String title;
// 
//   @Min(1)
//   public long price;
// 
//   @Min(1)
//   public int quantity;
// 
//   @Min(1)
//   public long totalPrice;
// 
// }
// 
// Path: order-context-parent/order-command/src/main/java/se/citerus/cqrs/bookstore/ordercontext/api/PlaceOrderRequest.java
// public class PlaceOrderRequest extends TransportObject {
// 
//   @NotEmpty
//   @Pattern(regexp = ID_PATTERN)
//   public String orderId;
// 
//   @NotNull
//   public String customerName;
// 
//   @NotNull
//   public String customerEmail;
// 
//   @NotNull
//   public String customerAddress;
// 
//   @NotNull
//   public CartDto cart;
// 
// }
// 
// Path: order-context-parent/order-query/src/main/java/se/citerus/cqrs/bookstore/ordercontext/query/QueryService.java
// public class QueryService {
// 
//   private final OrderListDenormalizer orderListDenormalizer;
//   private final OrdersPerDayAggregator ordersPerDayAggregator;
//   private final ProductCatalogClient productCatalogClient;
// 
//   public QueryService(OrderListDenormalizer orderListDenormalizer,
//                       OrdersPerDayAggregator ordersPerDayAggregator,
//                       ProductCatalogClient productCatalogClient) {
//     this.orderListDenormalizer = orderListDenormalizer;
//     this.ordersPerDayAggregator = ordersPerDayAggregator;
//     this.productCatalogClient = productCatalogClient;
//   }
// 
//   public OrderProjection getOrder(OrderId orderId) {
//     return orderListDenormalizer.get(orderId);
//   }
// 
//   public List<OrderProjection> getOrders() {
//     return orderListDenormalizer.getOrders();
//   }
// 
//   public PublisherContractId findPublisherContract(ProductId productId) {
//     ProductDto product = productCatalogClient.getProduct(productId.id);
//     return new PublisherContractId(product.publisherContractId);
//   }
// 
//   public Map<LocalDate, Integer> getOrdersPerDay() {
//     return ordersPerDayAggregator.getOrdersPerDay();
//   }
// 
// }


import io.dropwizard.testing.junit.ResourceTestRule;
import org.junit.After;
import org.junit.ClassRule;
import org.junit.Test;
import se.citerus.cqrs.bookstore.command.CommandBus;
import se.citerus.cqrs.bookstore.ordercontext.api.CartDto;
import se.citerus.cqrs.bookstore.ordercontext.api.LineItemDto;
import se.citerus.cqrs.bookstore.ordercontext.api.PlaceOrderRequest;
import se.citerus.cqrs.bookstore.ordercontext.query.QueryService;
import javax.ws.rs.client.Entity;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;

  @Test
  public void testCreateOrderRequest() {
    PlaceOrderRequest newOrderRequest = new PlaceOrderRequest();
    newOrderRequest.orderId = UUID.randomUUID().toString();
    newOrderRequest.customerAddress = "Address";
    newOrderRequest.customerEmail = "test@example.com";
    newOrderRequest.customerName = "John Doe";
    newOrderRequest.cart = createCart();
    createOrder(newOrderRequest);
  }

  private CartDto createCart() {
    CartDto cartDto = new CartDto();
    cartDto.cartId = UUID.randomUUID().toString();
    cartDto.totalPrice = 1200;
    cartDto.totalQuantity = 10;
    cartDto.lineItems = randomLineItems();
    return cartDto;
  }

  private List<LineItemDto> randomLineItems() {
    ArrayList<LineItemDto> lineItems = new ArrayList<>();
    LineItemDto item = new LineItemDto();
    item.productId = UUID.randomUUID().toString();
    item.price = 120;
    item.quantity = 10;
    item.title = "Some book";
    item.totalPrice = 1200;
    lineItems.add(item);
// Path: cqrs-lib/src/main/java/se/citerus/cqrs/bookstore/command/CommandBus.java
// public interface CommandBus {
// 
//   void dispatch(Command command);
// 
//   <T extends CommandHandler> T register(T handler);
// 
// }
// 
// Path: order-context-parent/order-command/src/main/java/se/citerus/cqrs/bookstore/ordercontext/api/CartDto.java
// public class CartDto {
// 
//   @NotEmpty
//   @Pattern(regexp = ID_PATTERN)
//   public String cartId;
// 
//   @Min(1)
//   public long totalPrice;
// 
//   @Min(1)
//   public int totalQuantity;
// 
//   @NotNull
//   @NotEmpty
//   public List<LineItemDto> lineItems;
// 
// }
// 
// Path: order-context-parent/order-command/src/main/java/se/citerus/cqrs/bookstore/ordercontext/api/LineItemDto.java
// public class LineItemDto {
// 
//   @NotEmpty
//   @Pattern(regexp = ID_PATTERN)
//   public String productId;
// 
//   @NotNull
//   public String title;
// 
//   @Min(1)
//   public long price;
// 
//   @Min(1)
//   public int quantity;
// 
//   @Min(1)
//   public long totalPrice;
// 
// }
// 
// Path: order-context-parent/order-command/src/main/java/se/citerus/cqrs/bookstore/ordercontext/api/PlaceOrderRequest.java
// public class PlaceOrderRequest extends TransportObject {
// 
//   @NotEmpty
//   @Pattern(regexp = ID_PATTERN)
//   public String orderId;
// 
//   @NotNull
//   public String customerName;
// 
//   @NotNull
//   public String customerEmail;
// 
//   @NotNull
//   public String customerAddress;
// 
//   @NotNull
//   public CartDto cart;
// 
// }
// 
// Path: order-context-parent/order-query/src/main/java/se/citerus/cqrs/bookstore/ordercontext/query/QueryService.java
// public class QueryService {
// 
//   private final OrderListDenormalizer orderListDenormalizer;
//   private final OrdersPerDayAggregator ordersPerDayAggregator;
//   private final ProductCatalogClient productCatalogClient;
// 
//   public QueryService(OrderListDenormalizer orderListDenormalizer,
//                       OrdersPerDayAggregator ordersPerDayAggregator,
//                       ProductCatalogClient productCatalogClient) {
//     this.orderListDenormalizer = orderListDenormalizer;
//     this.ordersPerDayAggregator = ordersPerDayAggregator;
//     this.productCatalogClient = productCatalogClient;
//   }
// 
//   public OrderProjection getOrder(OrderId orderId) {
//     return orderListDenormalizer.get(orderId);
//   }
// 
//   public List<OrderProjection> getOrders() {
//     return orderListDenormalizer.getOrders();
//   }
// 
//   public PublisherContractId findPublisherContract(ProductId productId) {
//     ProductDto product = productCatalogClient.getProduct(productId.id);
//     return new PublisherContractId(product.publisherContractId);
//   }
// 
//   public Map<LocalDate, Integer> getOrdersPerDay() {
//     return ordersPerDayAggregator.getOrdersPerDay();
//   }
// 
// }


// Path: order-context-parent/order-command/src/test/java/se/citerus/cqrs/bookstore/ordercontext/resource/OrderResourceTest.java
import io.dropwizard.testing.junit.ResourceTestRule;
import org.junit.After;
import org.junit.ClassRule;
import org.junit.Test;
import se.citerus.cqrs.bookstore.command.CommandBus;
import se.citerus.cqrs.bookstore.ordercontext.api.CartDto;
import se.citerus.cqrs.bookstore.ordercontext.api.LineItemDto;
import se.citerus.cqrs.bookstore.ordercontext.api.PlaceOrderRequest;
import se.citerus.cqrs.bookstore.ordercontext.query.QueryService;
import javax.ws.rs.client.Entity;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;


  @Test
  public void testCreateOrderRequest() {
    PlaceOrderRequest newOrderRequest = new PlaceOrderRequest();
    newOrderRequest.orderId = UUID.randomUUID().toString();
    newOrderRequest.customerAddress = "Address";
    newOrderRequest.customerEmail = "test@example.com";
    newOrderRequest.customerName = "John Doe";
    newOrderRequest.cart = createCart();
    createOrder(newOrderRequest);
  }

  private CartDto createCart() {
    CartDto cartDto = new CartDto();
    cartDto.cartId = UUID.randomUUID().toString();
    cartDto.totalPrice = 1200;
    cartDto.totalQuantity = 10;
    cartDto.lineItems = randomLineItems();
    return cartDto;
  }

  private List<LineItemDto> randomLineItems() {
    ArrayList<LineItemDto> lineItems = new ArrayList<>();
    LineItemDto item = new LineItemDto();
    item.productId = UUID.randomUUID().toString();
    item.price = 120;
    item.quantity = 10;
    item.title = "Some book";
    item.totalPrice = 1200;
    lineItems.add(item);
    return lineItems;