# typed: strict
# frozen_string_literal: true

require "utils/output"

module OS
  module Mac
    module Readall
      module ClassMethods
        extend T::Helpers
        include ::Utils::Output::Mixin

        requires_ancestor { Kernel }

        sig {
          params(
            tap:     ::Tap,
            os_name: T.nilable(Symbol),
            arch:    T.nilable(Symbol),
            files:   T.nilable(T::Array[::Pathname]),
          ).returns(T::Boolean)
        }
        def valid_casks?(tap, os_name: nil, arch: ::Hardware::CPU.type, files: nil)
          return super if os_name == :linux

          current_macos_version = if os_name.is_a?(Symbol)
            MacOSVersion.from_symbol(os_name)
          else
            MacOS.version
          end

          success = T.let(true, T::Boolean)
          (files || tap.cask_files).each do |file|
            cask = ::Cask::CaskLoader.load(file)

            # Fine to have missing URLs for unsupported macOS
            macos_req = cask.depends_on.macos
            next if macos_req&.version && Array(macos_req.version).none? do |macos_version|
              current_macos_version.compare(macos_req.comparator, macos_version)
            end

            raise "Missing URL" if cask.url.nil?
          rescue Interrupt
            raise
          # Handle all possible exceptions reading Casks.
          rescue Exception => e # rubocop:disable Lint/RescueException
            os_and_arch = "macOS #{current_macos_version} on #{arch}"
            onoe "Invalid cask (#{os_and_arch}): #{file}"
            $stderr.puts e
            success = false
          end
          success
        end
      end
    end
  end
end

Readall.singleton_class.prepend(OS::Mac::Readall::ClassMethods)
