defmodule Web.AdminDashboardLive do
  use Web, :live_view

  def mount(_params, _session, socket) do
    {:ok, socket}
  end

  def handle_params(params, _uri, socket) do
    kind = socket.assigns.live_action

    {:ok, {posts, meta}} = Core.Posts.list_posts(kind, params)

    socket =
      socket
      |> assign(
        kind: kind,
        meta: meta
      )
      |> stream(:posts, posts, reset: true)

    {:noreply, socket}
  end

  attr :post, Schema.Post, required: true

  defp post_status(%{post: %{published_at: nil, deleted_at: nil}} = assigns) do
    ~H"""
    draft
    """
  end

  defp post_status(%{post: %{published_at: _, deleted_at: nil}} = assigns) do
    ~H"""
    published
    """
  end

  defp post_status(assigns) do
    ~H"""
    deleted
    """
  end

  attr :post, Schema.Post, required: true

  defp post_actions(assigns) do
    ~H"""
    <div class="flex flex-row gap-x-1">
      <.link navigate={~p"/admin/posts/#{@post}"}>edit</.link>
      <.link
        :if={@post.published_at && is_nil(@post.deleted_at)}
        navigate={Web.Paths.public_post_path(@post)}
      >
        view
      </.link>
    </div>
    """
  end

  defp build_path(:blog, meta),
    do: Flop.Phoenix.build_path(~p"/admin/writing", meta, for: Schema.Post)

  defp build_path(:status, meta),
    do: Flop.Phoenix.build_path(~p"/admin/microblog", meta, for: Schema.Post)
end