defmodule LivebookWeb.UserComponent do
  use LivebookWeb, :live_component
  import LivebookWeb.UserHelpers
  alias Livebook.EctoTypes.HexColor
  alias Livebook.Users
  @impl true
  def update(assigns, socket) do
    socket = assign(socket, assigns)
    user = socket.assigns.user
    changeset = Users.change_user(user)
    {:ok, assign(socket, changeset: changeset, valid?: changeset.valid?, user: user)}
  end
  @impl true
  def render(assigns) do
    ~H"""
    
      
        User profile
      
      
        <.user_avatar user={@user} class="h-20 w-20" text_class="text-3xl" />
      
      <.form
        let={f}
        for={@changeset}
        phx-submit={@on_save |> JS.push("save")}
        phx-change="validate"
        phx-target={@myself}
        id="user_form"
        phx-hook="UserForm"
      >
        
          <.input_wrapper form={f} field={:name}>
            
Display name
            <%= text_input(f, :name, class: "input", spellcheck: "false") %>
          
          <.input_wrapper form={f} field={:hex_color}>
            
Cursor color
            <.hex_color_input
              form={f}
              field={:hex_color}
              randomize={JS.push("randomize_color", target: @myself)}
            />
          
          
         
    """
  end
  @impl true
  def handle_event("randomize_color", %{}, socket) do
    hex_color = HexColor.random(except: [socket.assigns.user.hex_color])
    handle_event("validate", %{"user" => %{"hex_color" => hex_color}}, socket)
  end
  def handle_event("validate", %{"user" => params}, socket) do
    changeset = Users.change_user(socket.assigns.user, params)
    user =
      if changeset.valid? do
        Ecto.Changeset.apply_action!(changeset, :update)
      else
        socket.assigns.user
      end
    {:noreply, assign(socket, changeset: changeset, valid?: changeset.valid?, user: user)}
  end
  def handle_event("save", %{"user" => params}, socket) do
    changeset = Users.change_user(socket.assigns.user, params)
    case Users.update_user(changeset) do
      {:ok, user} ->
        {:noreply, assign(socket, changeset: changeset, valid?: changeset.valid?, user: user)}
      {:error, changeset} ->
        {:noreply, assign(socket, changeset: changeset, valid?: changeset.valid?)}
    end
  end
end