module Gitlab
  module IssuableSorter
    class << self
      def sort(project, issuables, &sort_key)
        grouped_items = issuables.group_by do |issuable|
          if issuable.project.id == project.id
            :project_ref
          elsif issuable.project.namespace.id == project.namespace.id
            :namespace_ref
          else
            :full_ref
          end
        end

        natural_sort_issuables(grouped_items[:project_ref], project) +
          natural_sort_issuables(grouped_items[:namespace_ref], project) +
          natural_sort_issuables(grouped_items[:full_ref], project)
      end

      private

      def natural_sort_issuables(issuables, project)
        VersionSorter.sort(issuables || []) do |issuable|
          issuable.to_reference(project)
        end
      end
    end
  end
end