defmodule MicrowavepropWeb.UserManagementLive.Edit do
  @moduledoc false
  use MicrowavepropWeb, :live_view

  alias Microwaveprop.Accounts

  @impl true
  def render(assigns) do
    ~H"""
    <Layouts.app flash={@flash} current_scope={@current_scope}>
      <.header>
        Edit user
        <:subtitle>{@user.callsign} &middot; {@user.email}</:subtitle>
      </.header>

      <.form for={@form} id="user-form" phx-change="validate" phx-submit="save">
        <.input field={@form[:callsign]} type="text" label="Callsign" required />
        <.input field={@form[:name]} type="text" label="Name" required />
        <.input field={@form[:email]} type="email" label="Email" required />
        <label class="flex items-center gap-2 cursor-pointer mt-4">
          <.input field={@form[:is_admin]} type="checkbox" label="Admin" />
        </label>
        <footer class="mt-4 flex gap-2">
          <.button variant="primary" phx-disable-with="Saving...">Save</.button>
          <.button navigate={~p"/users"}>Cancel</.button>
        </footer>
      </.form>
    </Layouts.app>
    """
  end

  @impl true
  def mount(%{"id" => id}, _session, socket) do
    user = Accounts.get_user!(id)

    {:ok,
     socket
     |> assign(:page_title, "Edit user")
     |> assign(:user, user)
     |> assign(:form, to_form(Accounts.change_admin_user(user)))}
  end

  @impl true
  def handle_event("validate", %{"user" => params}, socket) do
    changeset = Accounts.change_admin_user(socket.assigns.user, params)
    {:noreply, assign(socket, form: to_form(changeset, action: :validate))}
  end

  def handle_event("save", %{"user" => params}, socket) do
    case Accounts.admin_update_user(socket.assigns.user, params) do
      {:ok, _user} ->
        {:noreply,
         socket
         |> put_flash(:info, "User updated")
         |> push_navigate(to: ~p"/users")}

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