class Locale < I18n::Locale::Tag::Rfc4646
  class List < Array
    attr_reader :locales

    def initialize(tags)
      super(tags.map { |tag| Locale.tag(tag) }).compact!
    end

    def candidates(preferred)
      preferred.expand & self
    end

    def preferred(preferred)
      candidates(preferred).first
    end

    def expand
      map(&:candidates).flatten.uniq << Locale.default
    end
  end

  def self.list(*tags)
    List.new(tags.flatten)
  end

  def self.default
    tag(I18n.default_locale)
  end

  def self.available
    @available ||= List.new(I18n.available_locales)
  end

  def candidates
    [self.class.new(language, script, region, variant),
     self.class.new(language, script, region),
     self.class.new(language, script, nil, variant),
     self.class.new(language, script),
     self.class.new(language, nil, region, variant),
     self.class.new(language, nil, region),
     self.class.new(language, nil, nil, variant),
     self.class.new(language)]
  end
end
