/**
   * Updates the GUI sections labels on the left side of the GUI with the currently selected Item
   */
  private void updateOverview() {

    // check if anything is selected
    if (!listView.getSelectionModel().isEmpty()) {
      ItemBox itemBox = listView.getSelectionModel().getSelectedItem();

      nameLabel.setText(itemBox.getName());
      amountLabel.setText(String.valueOf(itemBox.getAmount()) + "x");
      gtinLabel.setText(itemBox.getGtin());
      categoriesLabel.setText(itemBox.getCategoriesText("long"));
      attributesLabel.setText(itemBox.getAttributes());
      log.info("Overview set to " + itemBox.getName());
    }
  }
  /**
   * Updates the Item in the ItemBox itemBox
   *
   * @param itemBox
   */
  private void updateItem(ItemBox itemBox) {
    try {
      Item temp = getNewItem(itemBox.getGtin());

      // checks if the currently fetched temp Item is the still the same
      // item as the one online
      if (!temp.equals(itemBox.getItem())) {
        log.info(temp.name + " unequal to " + itemBox.getItem().name);
        itemBox.setItem(temp);
        log.info("Changed to " + temp.name);
      }
    } catch (Exception e1) {
      log.error("Error updating Item " + itemBox.getName() + " - " + e1.getMessage());
    }
  }
  /** Sets up the behaviour of the Items int the menubar */
  private void setupMenuItems() {
    aboutMenu.setOnAction(
        event -> {
          AnchorPane root;
          try {
            root = FXMLLoader.load(getClass().getResource("about.fxml"));

            Stage stage = new Stage();
            stage.setScene(new Scene(root));
            stage.setTitle("About");
            stage.show();
          } catch (Exception e) {
            log.error("Error loading About Window - " + e.getMessage());
          }
        });

    exitMenu.setOnAction(
        event -> {
          Platform.runLater(
              new Runnable() {
                @Override
                public void run() {
                  Platform.exit();
                  log.debug("Window closed");
                }
              });
        });

    loadMenu.setOnAction(event -> loadFile(true));

    saveMenu.setOnAction(event -> Main.serializeItems());

    groupByMenu.setOnAction(
        event -> {
          Optional<String> sortOption =
              Alerter.getChoiceDialog("Sorting", null, "Select how you want to group: ");
          sortOption.ifPresent(letter -> groupItems(letter));
        });

    updateAllMenu.setOnAction(
        event -> {
          new Thread(
                  new Task<Void>() {
                    @Override
                    protected Void call() throws Exception {
                      log.debug("UpdateAll Thread Triggered");

                      itemsMap.forEach(
                          (a, b) -> {
                            updateItem(b);
                          });

                      updateList();
                      Main.serializeItems();

                      log.debug("UpdateAll Thread terminated successfully");
                      return null;
                    }
                  })
              .start();
        });

    updateMenu.setOnAction(
        event -> {
          if (!listView.getSelectionModel().isEmpty()) {
            ItemBox itemBox = listView.getSelectionModel().getSelectedItem();
            updateItem(itemBox);
          } else {
            Alert alert =
                Alerter.getAlert(
                    AlertType.INFORMATION,
                    "No Item selected",
                    null,
                    "Please select the Item you want to update!");
            alert.showAndWait();
            log.debug("Info Popup triggered, No item selected");
          }
        });

    deleteMenu.setOnAction(
        event -> {
          ItemBox rem = itemsMap.remove(listView.getSelectionModel().getSelectedItem().getGtin());
          log.info("Item: " + rem.getName() + " removed");
          updateList();
        });

    repeatMenu.setOnAction(
        event -> {
          if (lastCommand != null) {
            String[] props = lastCommand.split(" ");
            log.info("Repeat called with: " + lastCommand);

            switch (props[0]) {
              case "ADD":
                addItem(props[1]);
                break;
              case "RM":
                removeItem(props[1]);
                break;
            }
          }
        });

    printMenu.setOnAction(
        event -> {
          printOut(PrintOutType.OVERVIEW);
        });

    printShoppingMenu.setOnAction(
        event -> {
          printOut(PrintOutType.SHOPPING);
        });
  }