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

  @impl true
  def mount(_params, _session, socket) do
    socket = assign(socket, :load_trix?, true)

    {:ok, socket}
  end

  @impl true
  def handle_params(_params, _uri, %{assigns: %{live_action: :new}} = socket) do
    post = %Schema.Post{}
    changeset = Core.Posts.changeset(post, %{})

    socket = assign(socket, post: post, form: to_form(changeset))

    {:noreply, socket}
  end

  def handle_params(%{"post_id" => post_id}, _uri, %{assigns: %{live_action: :edit}} = socket) do
    post = Core.Posts.get_post!(post_id)

    changeset = Core.Posts.changeset(post, %{})

    socket = assign(socket, post: post, form: to_form(changeset))

    {:noreply, socket}
  end

  @impl true
  def handle_event("save_post", %{"post" => attrs}, %{assigns: %{live_action: :new}} = socket) do
    socket =
      case Core.Posts.create_post(attrs) do
        {:ok, post} -> push_navigate(socket, to: ~p"/admin/posts/#{post}")
        {:error, changeset} -> assign(socket, form: to_form(changeset))
      end

    {:noreply, socket}
  end

  def handle_event("save_post", %{"post" => attrs}, %{assigns: %{post: post, live_action: :edit}} = socket) do
    socket =
      case Core.Posts.update_post(post, attrs) do
        {:ok, post} ->
          assign(socket,
            post: post,
            form:
              post
              |> Core.Posts.changeset(%{})
              |> to_form()
          )

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

    {:noreply, socket}
  end

  @impl true
  def render(assigns) do
    ~H"""
    <.form for={@form} class="flex flex-col gap-y-2" phx-submit="save_post">
      <.input type="hidden" field={@form[:body]} />
      <.input class="text-lg" field={@form[:title]} placeholder="Title" />
      <div id="editor" phx-update="ignore">
        <trix-editor input={@form[:body].id} class="prose prose-cms max-w-none"></trix-editor>
      </div>

      <button type="submit" class="self-end">save</button>
    </.form>
    """
  end
end