defmodule BerrypodWeb.AdminLayoutHook do
  @moduledoc """
  LiveView on_mount hook that assigns the current path for admin sidebar navigation
  and loads theme settings for the admin layout.
  """
  import Phoenix.Component

  alias Berrypod.{ActivityLog, Reviews, Settings}
  alias Berrypod.Theme.{CSSCache, CSSGenerator}

  def on_mount(:assign_current_path, _params, _session, socket) do
    theme_settings = Settings.get_theme_settings()

    generated_css =
      case CSSCache.get() do
        {:ok, css} ->
          css

        :miss ->
          css = CSSGenerator.generate(theme_settings, &BerrypodWeb.Endpoint.static_path/1)
          CSSCache.put(css)
          css
      end

    if Phoenix.LiveView.connected?(socket), do: ActivityLog.subscribe()

    socket =
      socket
      |> assign(:current_path, "")
      |> assign(:site_live, Settings.site_live?())
      |> assign(:theme_settings, theme_settings)
      |> assign(:site_name, Settings.site_name())
      |> assign(:site_description, Settings.site_description())
      |> assign(:generated_css, generated_css)
      |> assign(:attention_count, ActivityLog.count_needing_attention())
      |> assign(:pending_review_count, Reviews.count_pending_reviews())
      |> Phoenix.LiveView.attach_hook(:set_current_path, :handle_params, fn _params,
                                                                            uri,
                                                                            socket ->
        {:cont,
         socket
         |> assign(:current_path, URI.parse(uri).path)
         |> assign(:site_live, Settings.site_live?())}
      end)
      |> Phoenix.LiveView.attach_hook(:update_attention_count, :handle_info, fn
        {:new_activity, _entry}, socket ->
          {:cont, assign(socket, :attention_count, ActivityLog.count_needing_attention())}

        _other, socket ->
          {:cont, socket}
      end)

    {:cont, socket}
  end
end
