module BookmarksHelper
  # if the current user has the current object bookmarked return the existing bookmark
  # since the user may have multiple bookmarks for different pseuds we prioritize by current default pseud if more than one bookmark exists
  def bookmark_if_exists(bookmarkable)
    return nil unless logged_in?

    bookmarkable = bookmarkable.work if bookmarkable.class == Chapter

    current_user.bookmarks.where(bookmarkable: bookmarkable)
      .reorder("pseuds.is_default", "bookmarks.id").last
  end

  # returns just a url to the new bookmark form
  def get_new_bookmark_path(bookmarkable)
    return case bookmarkable.class.to_s
    when "Chapter"
      new_work_bookmark_path(bookmarkable.work)
    when "Work"
      new_work_bookmark_path(bookmarkable)
    when "ExternalWork"
      new_external_work_bookmark_path(bookmarkable)
    when "Series"
      new_series_bookmark_path(bookmarkable)
    end
  end

  def link_to_bookmarkable_bookmarks(bookmarkable, link_text='')
    if link_text.blank?
      link_text = number_with_delimiter(Bookmark.count_visible_bookmarks(bookmarkable, current_user))
    end
    path = case bookmarkable.class.name
           when "Work"
             then work_bookmarks_path(bookmarkable)
           when "ExternalWork"
             then external_work_bookmarks_path(bookmarkable)
           when "Series"
             then series_bookmarks_path(bookmarkable)
           end
    link_to link_text, path
  end

  # returns the appropriate small single icon for a bookmark -- not hardcoded, these are in css so they are skinnable
  def get_symbol_for_bookmark(bookmark)
    if bookmark.private?
      css_class = "private"
      title_string = "Private Bookmark"
    elsif bookmark.hidden_by_admin?
      css_class = "hidden"
      title_string = "Bookmark Hidden by Admin"
    elsif bookmark.rec?
      css_class = "rec"
      title_string = "Rec"
    else
      css_class = "public"
      title_string = "Public Bookmark"
    end
    link_to_help('bookmark-symbols-key', content_tag(:span, content_tag(:span, title_string, class: "text"), class: css_class, title: title_string))
  end

  def bookmark_form_path(bookmark, bookmarkable)
    if bookmark.new_record?
      if bookmarkable.new_record?
        bookmarks_path
      else
        polymorphic_path([bookmarkable, bookmark])
      end
    else
      bookmark_path(bookmark)
    end
  end

  def get_count_for_bookmark_blurb(bookmarkable)
    count = bookmarkable.public_bookmark_count
    link = link_to (count < 100 ? count.to_s : "*"),
              polymorphic_path([bookmarkable, Bookmark])
    content_tag(:span, link, class: "count")
  end

  # Bookmark blurbs contain a single bookmark from a single user.
  # bookmark blurb group creation-id [creator-ids bookmarker-id].uniq
  def css_classes_for_bookmark_blurb(bookmark)
    return if bookmark.nil?

    creation = bookmark.bookmarkable
    if creation.nil?
      "bookmark blurb group #{bookmarker_id_for_css_classes(bookmark)}"
    else
      Rails.cache.fetch("#{creation.cache_key_with_version}_#{bookmark.cache_key}/blurb_css_classes") do
        creation_id = creation_id_for_css_classes(creation)
        user_ids = user_ids_for_bookmark_blurb(bookmark).join(" ")
        "bookmark blurb group #{creation_id} #{user_ids}".squish
      end
    end
  end

  # Bookmarkable blurbs contain multiple short blurbs from different users.
  # Bookmarker ids are applied to the individual short blurbs.
  # Note that creation blurb classes are cached.
  # bookmark blurb group creation-id creator-ids
  def css_classes_for_bookmarkable_blurb(bookmarkable)
    return "bookmark blurb group" if bookmarkable.nil?

    creation_classes = css_classes_for_creation_blurb(bookmarkable)
    "bookmark #{creation_classes}".strip
  end

  def css_classes_for_bookmark_blurb_short(bookmark)
    return if bookmark.nil?

    own = "own" if is_author_of?(bookmark)
    bookmarker_id = bookmarker_id_for_css_classes(bookmark)
    "#{own} user short blurb group #{bookmarker_id}".squish
  end

  private

  def bookmarker_id_for_css_classes(bookmark)
    return if bookmark.nil?

    "user-#{bookmark.pseud.user_id}"
  end

  # Array of unique creator and bookmarker ids, formatted user-123, user-126.
  # If the user has bookmarked their own work, we don't need their id twice.
  def user_ids_for_bookmark_blurb(bookmark)
    user_ids = creator_ids_for_css_classes(bookmark.bookmarkable)
    user_ids << bookmarker_id_for_css_classes(bookmark)
    user_ids.uniq
  end
end
