defmodule CMSWeb.StatusLive do
  @moduledoc false
  use CMSWeb, :live_view

  alias CMS.Statuses
  alias CMS.Statuses.Status

  @impl true
  def mount(_params, _session, socket) do
    {:ok, socket}
  end

  @impl true
  def handle_params(_params, _uri, %{assigns: %{live_action: :new}} = socket) do
    status = %Status{}

    changeset = Status.changeset(status)

    socket = assign(socket, status: status, form: to_form(changeset))

    {:noreply, socket}
  end

  def handle_params(%{"status_id" => status_id}, _uri, %{assigns: %{live_action: :edit}} = socket) do
    status = Statuses.get_status!(status_id)

    changeset = Status.changeset(status)

    socket = assign(socket, status: status, form: to_form(changeset))

    {:noreply, socket}
  end

  @impl true
  def handle_event("save_status", %{"status" => attrs}, %{assigns: %{live_action: :new}} = socket) do
    socket =
      case Statuses.create_status(attrs) do
        {:ok, status} -> push_navigate(socket, to: ~p"/admin/statuses/#{status}")
        {:error, changeset} -> assign(socket, form: to_form(changeset))
      end

    {:noreply, socket}
  end

  def handle_event(
        "save_status",
        %{"status" => attrs},
        %{assigns: %{status: status, live_action: :edit}} = socket
      ) do
    socket =
      case Statuses.update_status(status, attrs) do
        {:ok, status} ->
          assign(socket, status: status, form: to_form(Status.changeset(status)))

        {:error, changeset} ->
          assign(socket, form: to_form(changeset))
      end

    {:noreply, socket}
  end

  @impl true
  def render(assigns) do
    ~H"""
    <.form for={@form} class="flex flex-col gap-y-2" phx-submit="save_status">
      <.input type="textarea" field={@form[:body]} />
      <button type="submit" class="self-end">save</button>
    </.form>
    """
  end
end