// Path: shopping-context/src/main/java/se/citerus/cqrs/bookstore/shopping/domain/Cart.java
// public class Cart {
// 
//   public final String cartId;
// 
//   private final Map<ProductId, LineItem> lineItems = new LinkedHashMap<>();
// 
//   public Cart(String cartId) {
//     this.cartId = cartId;
//   }
// 
//   public void add(Item item) {
//     LineItem lineItem = lineItems.get(item.productId);
//     if (lineItem == null) {
//       lineItem = new LineItem(item);
//     } else {
//       lineItem.increaseQuantity();
//     }
//     lineItems.put(item.productId, lineItem);
//   }
// 
//   public Collection<LineItem> getItems() {
//     return Collections.unmodifiableCollection(lineItems.values());
//   }
// 
//   public int getLineCount() {
//     return lineItems.size();
//   }
// 
//   public long getTotalPrice() {
//     long totalPrice = 0;
//     for (LineItem lineItem : lineItems.values()) {
//       totalPrice += lineItem.getTotalPrice();
//     }
//     return totalPrice;
//   }
// 
//   public int getTotalQuantity() {
//     int totalQuantity = 0;
//     for (LineItem lineItem : lineItems.values()) {
//       totalQuantity += lineItem.getQuantity();
//     }
//     return totalQuantity;
//   }
// 
//   public void remove(ProductId productId) {
//     LineItem lineItem = lineItems.get(productId);
//     if (lineItem != null) {
//       lineItem.decreaseQuantity();
//       if (lineItem.getQuantity() == 0) {
//         lineItems.remove(productId);
//       }
//     }
//   }
// 
//   public void removeAll(ProductId productId) {
//     lineItems.remove(productId);
//   }
// 
// }
// 
// Path: shopping-context/src/main/java/se/citerus/cqrs/bookstore/shopping/domain/Item.java
// public class Item extends ValueObject {
// 
//   public final ProductId productId;
//   public final String title;
//   public final long price;
// 
//   public Item(ProductId productId, String title, long price) {
//     this.productId = productId;
//     this.title = title;
//     this.price = price;
//   }
// 
// }
// 
// Path: shopping-context/src/main/java/se/citerus/cqrs/bookstore/shopping/domain/LineItem.java
// public class LineItem extends ValueObject {
// 
//   private final Item item;
//   private int quantity;
// 
//   public LineItem(Item item) {
//     this.item = item;
//     this.quantity = 1;
//   }
// 
//   public void increaseQuantity() {
//     this.quantity++;
//   }
// 
//   public void decreaseQuantity() {
//     if (quantity > 0) quantity--;
//   }
// 
//   public int getQuantity() {
//     return quantity;
//   }
// 
//   public long getPrice() {
//     return item.price;
//   }
// 
//   public long getTotalPrice() {
//     return item.price * quantity;
//   }
// 
//   public Item getItem() {
//     return item;
//   }
// 
// }


import se.citerus.cqrs.bookstore.shopping.domain.Cart;
import se.citerus.cqrs.bookstore.shopping.domain.Item;
import se.citerus.cqrs.bookstore.shopping.domain.LineItem;
import java.util.ArrayList;
import java.util.List;
package se.citerus.cqrs.bookstore.shopping.api;



public class CartDtoFactory {

  public static CartDto fromCart(Cart cart) {
    List<LineItemDto> lineItems = new ArrayList<>();

    for (LineItem lineItem : cart.getItems()) {
      LineItemDto itemDto = toLineItemDto(lineItem);
      lineItems.add(itemDto);
    }

    CartDto cartDto = new CartDto();
    cartDto.cartId = cart.cartId;
    cartDto.totalPrice = cart.getTotalPrice();
    cartDto.totalQuantity = cart.getTotalQuantity();
    cartDto.lineItems = lineItems;
    return cartDto;
  }

// Path: shopping-context/src/main/java/se/citerus/cqrs/bookstore/shopping/domain/Cart.java
// public class Cart {
// 
//   public final String cartId;
// 
//   private final Map<ProductId, LineItem> lineItems = new LinkedHashMap<>();
// 
//   public Cart(String cartId) {
//     this.cartId = cartId;
//   }
// 
//   public void add(Item item) {
//     LineItem lineItem = lineItems.get(item.productId);
//     if (lineItem == null) {
//       lineItem = new LineItem(item);
//     } else {
//       lineItem.increaseQuantity();
//     }
//     lineItems.put(item.productId, lineItem);
//   }
// 
//   public Collection<LineItem> getItems() {
//     return Collections.unmodifiableCollection(lineItems.values());
//   }
// 
//   public int getLineCount() {
//     return lineItems.size();
//   }
// 
//   public long getTotalPrice() {
//     long totalPrice = 0;
//     for (LineItem lineItem : lineItems.values()) {
//       totalPrice += lineItem.getTotalPrice();
//     }
//     return totalPrice;
//   }
// 
//   public int getTotalQuantity() {
//     int totalQuantity = 0;
//     for (LineItem lineItem : lineItems.values()) {
//       totalQuantity += lineItem.getQuantity();
//     }
//     return totalQuantity;
//   }
// 
//   public void remove(ProductId productId) {
//     LineItem lineItem = lineItems.get(productId);
//     if (lineItem != null) {
//       lineItem.decreaseQuantity();
//       if (lineItem.getQuantity() == 0) {
//         lineItems.remove(productId);
//       }
//     }
//   }
// 
//   public void removeAll(ProductId productId) {
//     lineItems.remove(productId);
//   }
// 
// }
// 
// Path: shopping-context/src/main/java/se/citerus/cqrs/bookstore/shopping/domain/Item.java
// public class Item extends ValueObject {
// 
//   public final ProductId productId;
//   public final String title;
//   public final long price;
// 
//   public Item(ProductId productId, String title, long price) {
//     this.productId = productId;
//     this.title = title;
//     this.price = price;
//   }
// 
// }
// 
// Path: shopping-context/src/main/java/se/citerus/cqrs/bookstore/shopping/domain/LineItem.java
// public class LineItem extends ValueObject {
// 
//   private final Item item;
//   private int quantity;
// 
//   public LineItem(Item item) {
//     this.item = item;
//     this.quantity = 1;
//   }
// 
//   public void increaseQuantity() {
//     this.quantity++;
//   }
// 
//   public void decreaseQuantity() {
//     if (quantity > 0) quantity--;
//   }
// 
//   public int getQuantity() {
//     return quantity;
//   }
// 
//   public long getPrice() {
//     return item.price;
//   }
// 
//   public long getTotalPrice() {
//     return item.price * quantity;
//   }
// 
//   public Item getItem() {
//     return item;
//   }
// 
// }


// Path: shopping-context/src/main/java/se/citerus/cqrs/bookstore/shopping/api/CartDtoFactory.java
import se.citerus.cqrs.bookstore.shopping.domain.Cart;
import se.citerus.cqrs.bookstore.shopping.domain.Item;
import se.citerus.cqrs.bookstore.shopping.domain.LineItem;
import java.util.ArrayList;
import java.util.List;

package se.citerus.cqrs.bookstore.shopping.api;



public class CartDtoFactory {

  public static CartDto fromCart(Cart cart) {
    List<LineItemDto> lineItems = new ArrayList<>();

    for (LineItem lineItem : cart.getItems()) {
      LineItemDto itemDto = toLineItemDto(lineItem);
      lineItems.add(itemDto);
    }

    CartDto cartDto = new CartDto();
    cartDto.cartId = cart.cartId;
    cartDto.totalPrice = cart.getTotalPrice();
    cartDto.totalQuantity = cart.getTotalQuantity();
    cartDto.lineItems = lineItems;
    return cartDto;
  }

  private static LineItemDto toLineItemDto(LineItem lineItem) {