defmodule SomethingErlangWeb.ThreadLive.Show do
  use SomethingErlangWeb, :live_view
  on_mount SomethingErlangWeb.UserLiveAuth

  alias SomethingErlang.Grover

  require Logger

  @impl true
  def mount(_params, _session, socket) do
    Grover.mount(socket.assigns.current_user)
    {:ok, socket}
  end

  @impl true
  def handle_params(%{"id" => id, "page" => page}, _, socket) do
    thread = Grover.get_thread!(id, page |> String.to_integer())

    {:noreply,
     socket
     |> assign(:page_title, thread.title)
     |> assign(:thread, thread)}
  end

  @impl true
  def handle_params(%{"id" => id}, _, socket) do
    {:noreply,
     push_redirect(socket,
       to: Routes.thread_show_path(socket, :show, id, page: 1)
     )}
  end

  def post(assigns) do
    ~H"""
    <div class="post">
        <.user info={@author} />
        <article class="postbody">
            <%= raw @article %>
        </article>
        <.toolbar date={@date} />
    </div>
    """
  end

  def user(assigns) do
    ~H"""
    <aside class="userinfo bg-base-100">
        <h3 class="mb-4"><%= @info.name %></h3>
        <div class="title hidden sm:flex flex-col text-sm pr-4">
          <%= raw @info.title %>
        </div>
    </aside>
    """
  end

  def toolbar(assigns) do
    ~H"""
    <div class="sm:col-span-2 text-sm p-2 px-4">
      <%= @date |> Calendar.strftime("%A, %b %d %Y @ %H:%M") %></div>
    """
  end

  def pagination(assigns) do
    %{page: page_number, page_count: page_count} = assigns.thread

    first_page_disabled_button = if page_number == 1, do: " btn-disabled", else: ""
    last_page_disabled_button = if page_number == page_count, do: " btn-disabled", else: ""
    active_page_button = " btn-active"

    prev_button_target = if page_number > 1, do: page_number - 1, else: 1
    next_button_target = if page_number < page_count, do: page_number + 1, else: page_count

    buttons = [
      %{label: "«", page: 1, special: "" <> first_page_disabled_button},
      %{label: "‹", page: prev_button_target, special: "" <> first_page_disabled_button},
      %{label: "#{page_number}", page: page_number, special: active_page_button},
      %{label: "›", page: next_button_target, special: "" <> last_page_disabled_button},
      %{label: "»", page: page_count, special: "" <> last_page_disabled_button}
    ]

    ~H"""
    <div class="navbar my-4 bg-base-200">
        <div class="flex-1"></div>
        <div class="pagination flex-none btn-group grid grid-cols-5">
            <%= for btn <- buttons do %>
                <%= live_redirect class: "btn btn-sm btn-ghost" <> btn.special,
                to: Routes.thread_show_path(@socket, :show, @thread.id, page: btn.page) do %>
                    <%= case btn.label do %>
                        <% "«" -> %><Icons.chevron_left_double /><%= btn.page %>
                        <% "‹" -> %><Icons.chevron_left /><%= btn.page %>
                        <% "›" -> %><%= btn.page %><Icons.chevron_right />
                        <% "»" -> %><%= btn.page %><Icons.chevron_right_double />
                        <% _ -> %><%= btn.page %>
                    <% end %>
                <% end %>
            <% end %>
        </div>
    </div>
    """
  end
end