defmodule Web.UserRegistrationLive do
  @moduledoc false
  use Web, :live_view

  alias Core.Accounts

  def mount(_params, _session, socket) do
    changeset = Accounts.change_user_registration(%Schema.User{})

    socket =
      socket
      |> assign(trigger_submit: false)
      |> assign_form(changeset)

    {:ok, socket, temporary_assigns: [form: nil], layout: false}
  end

  def handle_event("save", %{"user" => user_params}, socket) do
    socket =
      case Accounts.register_user(user_params) do
        {:ok, user} ->
          changeset = Accounts.change_user_registration(user)
          socket |> assign(trigger_submit: true) |> assign_form(changeset)

        {:error, %Ecto.Changeset{} = changeset} ->
          assign_form(socket, changeset)
      end

    {:noreply, socket}
  end

  def handle_event("validate", %{"user" => user_params}, socket) do
    changeset = Accounts.change_user_registration(%Schema.User{}, user_params)
    {:noreply, assign_form(socket, Map.put(changeset, :action, :validate))}
  end

  def render(assigns) do
    ~H"""
    <div class="mx-auto max-w-sm">
      <header class="text-center">finish installation</header>

      <.form
        for={@form}
        id="registration_form"
        phx-submit="save"
        phx-change="validate"
        phx-trigger-action={@trigger_submit}
        action={~p"/admin/users/log_in?_action=registered"}
        method="post"
      >
        <.input field={@form[:username]} type="text" label="username" />
        <.input field={@form[:password]} type="password" label="password" />
        <.button type="submit">create administrator</.button>
      </.form>
    </div>
    """
  end

  defp assign_form(socket, %Ecto.Changeset{} = changeset) do
    form = to_form(changeset, as: "user")

    assign(socket, form: form)
  end
end