defmodule Content.LayoutView do
  use Content, :view

  alias Content.{Option, Options}

  def title(Content.PostsView, "index.html", assigns) do
    "Page #{assigns.page} | #{title(nil, nil, nil)}"
  end

  def title(Content.FeedsView, "index.rss", %{category: category}) do
    "#{category} | #{title(nil, nil, nil)}"
  end

  def title(Content.PostsView, "show.html", assigns) do
    (assigns.post.post_title |> HtmlSanitizeEx.strip_tags()) <> " | " <> title(nil, nil, nil)
  end

  def title(_, _, _) do
    case Options.get("blogname") do
      opt = %Option{} ->
        opt.option_value
      _ ->
        I18n.t! "en", "site.title"
    end
  end

  def excerpt(Content.PostsView, "show.html", assigns) do
    assigns.post.post_excerpt
    |> HtmlSanitizeEx.strip_tags()
  end

  def excerpt(Content.FeedsView, "index.rss", %{category: category}) do
    "#{category} | #{excerpt(nil, nil, nil)}"
  end

  def excerpt(_, _, _) do
    case Options.get("blogdescription") do
      opt = %Option{} ->
        opt.option_value
      _ ->
        I18n.t! "en", "site.excerpt"
    end
  end

  def author(Content.PostsView, "show.html", assigns) do
    case assigns do
      %{author: %{display_name: name}} ->
        name
      _ ->
        "Anonymous"
    end
  end

  def author(_, _, _) do
    "Anonymous"
  end

  def corresponding_feed_url(conn, _, _, %{category: nil}) do
    Routes.index_feed_url(conn, :index)
  end

  def corresponding_feed_url(conn, Content.PostsView, "index.html", %{category: category}) do
    Routes.category_feed_url(conn, :index, category)
  end

  def corresponding_feed_url(conn, _, _, _) do
    Routes.index_feed_url(conn, :index)
  end

  def menu_markup(menu_items, conn), do: menu_markup(menu_items, conn, 0)
  def menu_markup(nil, _, _), do: ""
  def menu_markup([], _, _), do: ""
  def menu_markup(menu_items, conn, level) do
    ~E"""
      <ul style="--menu-level: <%= level %>;">
        <%= for item <- menu_items do %>
          <li>
            <label>
            <%= case item[:type] do %>
              <% "category" -> %>
              <%= link item[:related_item].title, to: Routes.category_path(conn, :index_posts, item[:related_item].slug) %>
              <% _ -> %>
              <%= link item[:related_item].title, to: Routes.posts_path(conn, :show, item[:related_item].slug) %>
            <% end %>
            <%= menu_markup(item[:children], conn, level + 1) %>
            </label>
          </li>
        <% end %>
      </ul>
    """
  end
end