# typed: strict
# frozen_string_literal: true

module Homebrew
  module Bundle
    module Skipper
      class << self
        sig { params(entry: Dsl::Entry, silent: T::Boolean).returns(T::Boolean) }
        def skip?(entry, silent: false)
          require "bundle/brew"

          full_name = entry.options[:full_name]
          return true if @failed_taps&.any? do |tap|
            prefix = "#{tap}/"
            entry.name.start_with?(prefix) || (full_name.is_a?(String) && full_name.start_with?(prefix))
          end

          entry_type_skips = Array(skipped_entries[entry.type])
          return false if entry_type_skips.empty?

          # Check the name or ID particularly for Mac App Store entries where they
          # can have spaces in the names (and the `mas` output format changes on
          # occasion).
          entry_ids = [entry.name, entry.options[:id]&.to_s].compact
          return false unless entry_type_skips.intersect?(entry_ids)

          puts Formatter.warning "Skipping #{entry.name}" unless silent
          true
        end

        sig { params(tap_name: String).void }
        def tap_failed!(tap_name)
          @failed_taps ||= T.let([], T.nilable(T::Array[String]))
          @failed_taps << tap_name
        end

        sig { params(failed_taps: T.nilable(T::Array[String])).returns(T.nilable(T::Array[String])) }
        attr_writer :failed_taps

        sig {
          params(skipped_entries: T.nilable(T::Hash[Symbol, T.nilable(T::Array[String])]))
            .returns(T.nilable(T::Hash[Symbol, T.nilable(T::Array[String])]))
        }
        attr_writer :skipped_entries

        private

        sig { returns(T::Hash[Symbol, T.nilable(T::Array[String])]) }
        def skipped_entries
          return @skipped_entries if @skipped_entries

          @skipped_entries ||= T.let({}, T.nilable(T::Hash[Symbol, T.nilable(T::Array[String])]))
          [:brew, :cask, :mas, :tap, :flatpak, :winget].each do |type|
            @skipped_entries[type] =
              ENV["HOMEBREW_BUNDLE_#{type.to_s.upcase}_SKIP"]&.split
          end
          @skipped_entries
        end
      end
    end
  end
end

require "extend/os/bundle/skipper"
