lib/athena_web/admin/controllers/item_controller.ex

defmodule AthenaWeb.Admin.ItemController do
  use AthenaWeb, :controller

  alias Athena.Inventory
  alias Athena.Inventory.Item

  def index(conn, %{"item_group" => item_group}) do
    item_group =
      item_group
      |> Inventory.get_item_group!()
      |> Repo.preload(:event)

    items = Inventory.list_items(item_group)

    render_with_navigation(conn, item_group.event, "index.html",
      items: items,
      item_group: item_group
    )
  end

  def new(conn, %{"item_group" => item_group}) do
    item_group =
      item_group
      |> Inventory.get_item_group!()
      |> Repo.preload(:event)

    changeset = Inventory.change_item(%Item{})

    render_with_navigation(conn, item_group.event, "new.html",
      changeset: changeset,
      item_group: item_group
    )
  end

  def create(conn, %{"item" => item_params, "item_group" => item_group}) do
    item_group =
      item_group
      |> Inventory.get_item_group!()
      |> Repo.preload(:event)

    case Inventory.create_item(item_group, item_params) do
      {:ok, item} ->
        conn
        |> put_flash(:info, gettext("Item created successfully."))
        |> redirect(to: Routes.admin_item_path(conn, :show, item))

      {:error, %Ecto.Changeset{} = changeset} ->
        render_with_navigation(conn, item_group.event, "new.html",
          changeset: changeset,
          item_group: item_group
        )
    end
  end

  def show(conn, %{"id" => id}) do
    item =
      id
      |> Inventory.get_item!()
      |> Repo.preload(:event)

    render_with_navigation(conn, item.event, "show.html",
      item: item,
      supply: Inventory.get_item_supply(item),
      consumption: Inventory.get_item_consumption(item),
      stock: Inventory.get_item_stock(item),
      relocations: Inventory.get_item_relocations(item)
    )
  end

  def edit(conn, %{"id" => id}) do
    item =
      id
      |> Inventory.get_item!()
      |> Repo.preload(:event)

    changeset = Inventory.change_item(item)

    render_with_navigation(conn, item.event, "edit.html", item: item, changeset: changeset)
  end

  def update(conn, %{"id" => id, "item" => item_params}) do
    item =
      id
      |> Inventory.get_item!()
      |> Repo.preload(:event)

    case Inventory.update_item(item, item_params) do
      {:ok, item} ->
        conn
        |> put_flash(:info, gettext("Item updated successfully."))
        |> redirect(to: Routes.admin_item_path(conn, :show, item))

      {:error, %Ecto.Changeset{} = changeset} ->
        render_with_navigation(conn, item.event, "edit.html", item: item, changeset: changeset)
    end
  end

  def delete(conn, %{"id" => id}) do
    %{item_group_id: item_group_id} = item = Inventory.get_item!(id)
    {:ok, _item} = Inventory.delete_item(item)

    conn
    |> put_flash(:info, gettext("Item deleted successfully."))
    |> redirect(to: Routes.admin_item_path(conn, :index, item_group_id))
  end
end