/*
   * The addItem method adds a product items with one or more quantity to the cart by adding thes
   * item to a list and calling the addItems method.
   */
  @RequestMapping(
      value = "/addItem.htm",
      method = {RequestMethod.GET, RequestMethod.POST})
  public String addItem(
      @RequestParam(required = false) Boolean ajax,
      @ModelAttribute AddToCartItem addToCartItem,
      BindingResult errors,
      ModelMap model,
      HttpServletRequest request) {
    if (ajax == null) {
      ajax = false;
    }

    /*
    new AddToCartItemsValidator().validate(addToCartItems, errors);
    if (errors.hasErrors()) {
        return refererRedirect(model, errors, request, ajax);
    }
     */

    Order currentCartOrder = retrieveCartOrder(request, model);
    List<OrderItem> orderItemsAdded = new ArrayList<OrderItem>();

    if (addToCartItem.getQuantity() > 0) {
      try {
        OrderItem orderItem;
        if (addToCartItem.getSkuId() == 180) {
          BundleOrderItemRequest itemRequest = new BundleOrderItemRequest();
          DiscreteOrderItemRequest discreteRequest1 =
              cartService.createDiscreteOrderItemRequest(
                  addToCartItem.getSkuId(),
                  addToCartItem.getProductId(),
                  addToCartItem.getCategoryId(),
                  addToCartItem.getQuantity());
          DiscreteOrderItemRequest discreteRequest2 =
              cartService.createDiscreteOrderItemRequest(
                  11L, null, null, addToCartItem.getQuantity());
          itemRequest.getDiscreteOrderItems().add(discreteRequest1);
          itemRequest.getDiscreteOrderItems().add(discreteRequest2);
          itemRequest.setName("Havaletta Bundle");
          itemRequest.setQuantity(1);
          if (addToCartItem.getOrderId() != null) {
            orderItem =
                cartService.addBundleItemToOrder(
                    cartService.findOrderById(addToCartItem.getOrderId()), itemRequest);
          } else {
            orderItem = cartService.addBundleItemToOrder(currentCartOrder, itemRequest);
          }
        } else {
          if (addToCartItem.getOrderId() != null) {
            orderItem =
                cartService.addSkuToOrder(
                    addToCartItem.getOrderId(),
                    addToCartItem.getSkuId(),
                    addToCartItem.getProductId(),
                    addToCartItem.getCategoryId(),
                    addToCartItem.getQuantity());
          } else {
            orderItem =
                cartService.addSkuToOrder(
                    currentCartOrder.getId(),
                    addToCartItem.getSkuId(),
                    addToCartItem.getProductId(),
                    addToCartItem.getCategoryId(),
                    addToCartItem.getQuantity());
          }
        }
        orderItemsAdded.add(orderItem);
      } catch (PricingException e) {
        LOG.error("Unable to price the order: (" + currentCartOrder.getId() + ")", e);
      }
    }

    model.addAttribute("orderItemsAdded", orderItemsAdded);

    if (!ajax) {
      return addItemViewRedirect ? "redirect:" + addItemView : addItemView;
    } else {
      return "catalog/fragments/addToCartModal";
    }
  }