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

  alias Core.Accounts

  def render(assigns) do
    # ~H"""
    # <div class="mx-auto max-w-sm">
    #   <.header class="text-center">
    #     Register for an account
    #     <:subtitle>
    #       Already registered?
    #       <.link navigate={~p/admin/users/log_in"} class="font-semibold text-brand hover:underline">
    #         Log in
    #       </.link>
    #       to your account now.
    #     </:subtitle>
    #   </.header>

    #   <.simple_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"
    #   >
    #     <.error :if={@check_errors}>
    #       Oops, something went wrong! Please check the errors below.
    #     </.error>

    #     <.input field={@form[:email]} type="email" label="Email" required />
    #     <.input field={@form[:password]} type="password" label="Password" required />

    #     <:actions>
    #       <.button phx-disable-with="Creating account..." class="w-full">Create an account</.button>
    #     </:actions>
    #   </.simple_form>
    # </div>
    # """
    ~H"""
    <pre>UserRegistrationLive</pre>
    """
  end

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

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

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

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

      {:error, %Ecto.Changeset{} = changeset} ->
        {:noreply, socket |> assign(check_errors: true) |> assign_form(changeset)}
    end
  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

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

    if changeset.valid? do
      assign(socket, form: form, check_errors: false)
    else
      assign(socket, form: form)
    end
  end
end