JSFiddle - React, Tailwind, and code Playground

by cmruser

JavaScript

class Order {
  constructor(inventory) {
    this.inventory = inventory;
    this.itemsByCategory = { "Burgers": [], "Sides": [], "Drinks": [] };
    this.combos = [];
  }

  async addItem(item_id) {
    const [stockLevel, item] = await Promise.all([
      this.inventory.getStock(item_id),
      this.inventory.getItem(item_id)
    ]);

    if (stockLevel == 0) {
      return [false, itemId];
    }

    const success = await this.inventory.decrementStock(itemId);
    if (!success) {
      return [false, itemId];
    }

    this.itemsByCategory[item.category].push(item);

    return [true, itemId];
  }

  findCombos() {
    let numberOfCombos = null;

    for (const categoryItems of Object.values(this.itemsByCategory)) {
      if (numberOfCombos == null) {
        numberOfCombos = categoryItems.length;
      } else {
        numberOfCombos = Math.min(numberOfCombos, categoryItems.length);
      }
    }

    this.itemsByCategory["Burgers"].sort((a, b) => a.price - b.price);
    this.itemsByCategory["Sides"].sort((a, b) => a.price - b.price);
    this.itemsByCategory["Drinks"].sort((a, b) => a.price - b.price);

    for (let i = 0; i < numberOfCombos; i++) {
      const burger = this.itemsByCategory["Burgers"].pop();
      const side = this.itemsByCategory["Sides"].pop();
      const drink = this.itemsByCategory["Drinks"].pop();
      const combo = new Combo(burger, side, drink);
      this.combos.push(combo);
    }
  }

  getPrice() {
    this.findCombos();
    let subTotal = 0;

    for (const category of Object.values(this.itemsByCategory)) {
      for (const item of category) {
        subTotal += item.price;
      }
    }

    for (const combo of this.combos) {
      subTotal += combo.price;
    }

    return subTotal;
  }

  toString() {
    let string = "";

    for (let i = 0; i < this.combos.length; i++) {
      string += this.combos[i].toString();
      if (i != this.combos.length - 1) {
        string += "\n";
      }
    }

    if (this.combos.length > 0)...