require "pact_broker/pacts/selector"

module PactBroker
  module Pacts
    class Selectors < Array
      def initialize *selectors
        super([*selectors].flatten)
      end

      def self.create_for_all_of_each_tag(tag_names)
        Selectors.new(tag_names.collect{ | tag_name | Selector.all_for_tag(tag_name) })
      end

      def self.create_for_latest_of_each_tag(tag_names)
        Selectors.new(tag_names.collect{ | tag_name | Selector.latest_for_tag(tag_name) })
      end

      def self.create_for_latest_for_tag(tag_name)
        Selectors.new([Selector.latest_for_tag(tag_name)])
      end

      def self.create_for_latest_of_each_branch(branches)
        Selectors.new(branches.collect{ | branch | Selector.latest_for_branch(branch) })
      end

      def self.create_for_latest_for_branch(branch)
        Selectors.new([Selector.latest_for_branch(branch)])
      end

      def self.create_for_latest_from_main_branch
        Selectors.new([Selector.latest_for_main_branch])
      end

      def self.create_for_overall_latest
        Selectors.new([Selector.overall_latest])
      end

      def resolve(consumer_version)
        Selectors.new(collect{ |selector| selector.resolve(consumer_version) })
      end

      def resolve_for_environment(consumer_version, environment)
        Selectors.new(collect{ |selector| selector.resolve_for_environment(consumer_version, environment) })
      end

      def + other
        Selectors.new(super)
      end

      def sort
        Selectors.new(super)
      end

      def overall_latest?
        any?(&:overall_latest?)
      end

      def latest_for_tag? potential_tag = nil
        any? { | selector | selector.latest_for_tag?(potential_tag) }
      end

      def tag_names_of_selectors_for_all_pacts
        select(&:all_for_tag?).collect(&:tag).uniq
      end

      def tag_names_of_selectors_for_latest_pacts
        select(&:latest_for_tag?).collect(&:tag).uniq
      end

      def branches_of_selectors_for_latest_pacts
        select(&:latest_for_branch?).collect(&:branch).uniq
      end
    end
  end
end
