/**
   * Sells a specified number of records Throws an exception if the record doesn't exist in the
   * store or if trying to sell more records than exist in the inventory
   *
   * @param record - the record to sell
   * @param quantity - the number of records to sell
   */
  public void sellItem(AudioFormat record, int quantity)
      throws NullPointerException, IllegalArgumentException {
    // System.out.println("Selling: " + record.toString() + ", quantity: " + quantity);
    InventoryItem item = null;
    for (int i = 0; i < this.listOfItems.length; i++) {
      item = this.listOfItems[i];

      // If it finds the record, break out of the loop
      if (record.equals(item.getRecord())) {
        break;
      }
    }

    // Handle the record not being in the inventory
    if (item == null) {
      throw new NullPointerException(
          "Error: there is no record of this type in stock "
              + "(record does not exist within the array).");
    }

    // Handle selling more items than the store has
    if (item.getQuantity() - quantity < 0) {
      throw new IllegalArgumentException(
          "Error: you cannot sell more records than you have "
              + "(# of records sold makes quantity smaller than 0).");
    }
    item.setQuantity(item.getQuantity() - quantity);
  }
  /**
   * Searches the inventory for all records by an artist and prints them
   *
   * @param artist - the artist to search for
   */
  public InventoryItem[] findItemsByArtist(String artist) {
    // System.out.println("Finding: " + artist);
    // Creates a temporary array to fill with items by the specified artist at the same size as the
    // whole inventory
    InventoryItem[] items = new InventoryItem[this.listOfItems.length];
    int count = 0;

    // Iterates through the entire inventory
    for (int i = 0; i < this.listOfItems.length; i++) {
      InventoryItem item = this.listOfItems[i];
      if (item.getRecord().getArtist().equals(artist)) {
        // Prints the item and adds it to the new array
        System.out.println(item.toString());
        items[count] = item;
        count++;
      }
    }
    count = 0;

    // Checks to see how many items actually exist in the array
    for (int i = 0; i < items.length; i++) {
      if (items[i] != null) {
        count++;
      }
    }

    // Creates a new array with the exact size to return
    InventoryItem[] matchingItems = new InventoryItem[count];
    for (int i = 0; i < matchingItems.length; i++) {
      matchingItems[i] = items[i];
    }
    return matchingItems;
  }
  /**
   * Writes the contents of listOfItems to the file at the specified path Precondition - the file
   * must already exist
   *
   * @param path - the file to write to
   */
  public void writeToFile(String path) {
    PrintWriter writer = null;
    try {
      writer = new PrintWriter(path);

      // Iterates through every item in the store
      for (InventoryItem item : this.listOfItems) {
        DecimalFormat decimalFormat = new DecimalFormat("#0.00");

        // Uses StringBuilder instead of String concatenation to save memory in the loop
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(item.getRecord().toString());
        stringBuilder.append(",");
        stringBuilder.append(item.getQuantity());
        stringBuilder.append(",");

        // Ensures that the price has only two decimal places
        stringBuilder.append(decimalFormat.format(item.getPrice()));
        stringBuilder.append("\n");
        writer.write(stringBuilder.toString());
      }
    } catch (FileNotFoundException e) {
      System.out.println("Error transcribing output.");
      e.printStackTrace();
    } finally {
      writer.close();
    }
  }
  /**
   * Adds a specified number of records to the inventory and updates the price
   *
   * @param record - the record to add
   * @param quantity - the number of records to add
   * @param price - the price to sell the record at
   */
  public void addItem(AudioFormat record, int quantity, double price) {
    // System.out.println("Adding: " + record.toString() + ", quantity: " + quantity + ", price: " +
    // price);
    for (int i = 0; i < this.listOfItems.length; i++) {
      InventoryItem item = this.listOfItems[i];

      // If the record is found, set the price and add the quantity and end the method
      if (record.equals(item.getRecord())) {
        item.setPrice(price);
        item.setQuantity(item.getQuantity() + quantity);
        return;
      }
    }

    // If it's an entirely new record, duplicates the old array and increases its size by 1
    InventoryItem[] temp = new InventoryItem[this.listOfItems.length + 1];
    for (int i = 0; i < this.listOfItems.length; i++) {
      temp[i] = this.listOfItems[i];
    }
    this.listOfItems = temp;

    // Adds the new record to the end of the array
    this.listOfItems[this.listOfItems.length - 1] = new InventoryItem(record, quantity, price);
  }