defmodule BoutiqueInventory do
  def sort_by_price(inventory) do
    Enum.sort_by(inventory, & &1[:price])
  end

  def with_missing_price(inventory) do
    Enum.filter(inventory, &(!&1[:price]))
  end

  def update_names(inventory, old_word, new_word) do
    inventory
    |> Enum.map(fn item ->
      new_name = String.replace(item.name, old_word, new_word)
      %{item | name: new_name}
    end)
  end

  def increase_quantity(item, count) do
    item
    |> Map.get_and_update(:quantity_by_size, fn quantities ->
      {quantities, update_quantities(quantities, count)}
    end)
    |> elem(1)
  end

  defp update_quantities(quantities, count) do
    quantities
    |> Map.to_list()
    |> Enum.map(&increase_size_quantity(&1, count))
    |> Enum.into(%{})
  end

  defp increase_size_quantity({key, value}, count), do: {key, value + count}

  def total_quantity(item) do
    item.quantity_by_size
    |> Enum.reduce(0, &sum_total_quantity/2)
  end

  defp sum_total_quantity({_key, value}, acc), do: acc + value
end