lib/athena_web/admin/controllers/movement_controller.ex

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

  alias Athena.Inventory
  alias Athena.Inventory.Movement

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

    movements =
      item
      |> Inventory.list_movements()
      |> Repo.preload([:source_location, :destination_location])

    render_with_navigation(conn, item.event, "index.html", movements: movements, item: item)
  end

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

    locations = Inventory.list_locations(item.event)
    changeset = Inventory.change_movement(%Movement{})

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

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

    locations = Inventory.list_locations(item.event)

    case Inventory.create_movement(item, movement_params) do
      {:ok, movement} ->
        conn
        |> put_flash(:info, gettext("Movement created successfully."))
        |> redirect(to: Routes.admin_movement_path(conn, :show, movement))

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

  def show(conn, %{"id" => id}) do
    movement =
      id
      |> Inventory.get_movement!()
      |> Repo.preload([:item, :item_group, :source_location, :destination_location, :event])

    render_with_navigation(conn, movement.event, "show.html", movement: movement)
  end

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

    locations = Inventory.list_locations(movement.event)
    changeset = Inventory.change_movement(movement)

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

  def update(conn, %{"id" => id, "movement" => movement_params}) do
    movement =
      id
      |> Inventory.get_movement!()
      |> Repo.preload(:event)

    locations = Inventory.list_locations(movement.event)

    case Inventory.update_movement(movement, movement_params) do
      {:ok, movement} ->
        conn
        |> put_flash(:info, gettext("Movement updated successfully."))
        |> redirect(to: Routes.admin_movement_path(conn, :show, movement))

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

  def delete(conn, %{"id" => id}) do
    %{item_id: item_id} = movement = Inventory.get_movement!(id)
    {:ok, _movement} = Inventory.delete_movement(movement)

    conn
    |> put_flash(:info, gettext("Movement deleted successfully."))
    |> redirect(to: Routes.admin_movement_path(conn, :index, item_id))
  end
end