require_relative "gem_specs/downloader"
require_relative "gem_specs/parser"
require_relative "gem_specs/specs"

module Artifactory
  module GemImport
    module GemSpecs
      module_function

      def missing_gems(source_repo:, target_repo:, only: /.+/)
        source_specs = get repo: source_repo, only: only
        target_specs = get repo: target_repo, only: only

        source_specs - target_specs
      end

      def get(repo:, only: /.+/)
        %i[prerelease_specs_url specs_url]
          .flat_map { |getter| fetch repo.public_send(getter), repo.headers }
          .sort
          .then { |specs| Specs.filter specs, only: only }
      end

      private_class_method

      def fetch(url, headers)
        Specs.new(url: url, headers: headers)
             .specs
      rescue Zlib::GzipFile::Error, Net::HTTPClientException, Net::HTTPFatalError, Net::OpenTimeout, SocketError => err
        raise ClientError, "Could not fetch specs. URL: #{url}, Reason: #{err.message}"
      end
    end
  end
end