defmodule SlaxWeb.ChatRoomLive.Edit do
  @moduledoc false
  use SlaxWeb, :live_view

  alias Slax.Chat

  @impl Phoenix.LiveView
  def render(assigns) do
    ~H"""
    <div class="mx-auto w-96 mt-12">
      <.header>
        <%= @page_title %>
        <:actions>
          <.link
            class="font-normal text-xs text-blue-600 hover:text-blue-700"
            navigate={~p"/rooms/#{@room}"}
          >
            Back
          </.link>
        </:actions>
      </.header>
      <.simple_form for={@form} id="room-form" phx-change="validate-room" phx-submit="save-room">
        <.input field={@form[:name]} type="text" label="Name" phx-debounce />
        <.input field={@form[:topic]} type="text" label="Topic" phx-debounce />
        <:actions>
          <.button phx-disable-with="Saving..." class="w-full">Save</.button>
        </:actions>
      </.simple_form>
    </div>
    """
  end

  @impl Phoenix.LiveView
  def mount(%{"id" => id}, _session, socket) do
    room = Chat.get_room!(id)
    changeset = Chat.change_room(room)

    socket =
      socket
      |> assign(page_title: "Edit chat room", room: room)
      |> assign_form(changeset)

    {:ok, socket}
  end

  @impl Phoenix.LiveView
  def handle_event("save-room", %{"room" => room_params}, socket) do
    socket =
      case Chat.update_room(socket.assigns.room, room_params) do
        {:ok, room} ->
          socket
          |> put_flash(:info, "Room #{room.name} updated succesfully")
          |> push_navigate(to: ~p"/rooms/#{room}")

        {:error, changeset} ->
          assign_form(socket, changeset)
      end

    {:noreply, socket}
  end

  @impl Phoenix.LiveView
  def handle_event("validate-room", %{"room" => room_params}, socket) do
    changeset =
      socket.assigns.room
      |> Chat.change_room(room_params)
      |> Map.put(:action, :validate)

    {:noreply, assign_form(socket, changeset)}
  end

  defp assign_form(socket, %Ecto.Changeset{} = changeset) do
    assign(socket, :form, to_form(changeset))
  end
end