#mixin for all guardian methods dealing with category permisions
module CategoryGuardian

  # Creating Method
  def can_create_category?(parent=nil)
    is_admin? ||
    (
      SiteSetting.allow_moderators_to_create_categories &&
      is_moderator?
    )
  end

  # Editing Method
  def can_edit_category?(category)
    is_admin? ||
    (
      SiteSetting.allow_moderators_to_create_categories &&
      is_moderator? &&
      can_see_category?(category)
    )
  end

  def can_delete_category?(category)
    can_edit_category?(category) &&
    category.topic_count == 0 &&
    !category.uncategorized? &&
    !category.has_children?
  end

  def can_see_category?(category)
    not(category.read_restricted) || secure_category_ids.include?(category.id)
  end

  def secure_category_ids
    @secure_category_ids ||= @user.secure_category_ids
  end

  # all allowed category ids
  def allowed_category_ids
    unrestricted = Category.where(read_restricted: false).pluck(:id)
    unrestricted.concat(secure_category_ids)
  end

  def topic_create_allowed_category_ids
    @topic_create_allowed_category_ids ||= @user.topic_create_allowed_category_ids
  end
end