# frozen_string_literal: true

module Facter
  module Resolvers
    module Macosx
      class Processors < BaseResolver
        init_resolver

        ITEMS = { logical_count: 'hw.logicalcpu_max',
                  physical_count: 'hw.physicalcpu_max',
                  brand: 'machdep.cpu.brand_string',
                  speed: 'hw.cpufrequency_max',
                  cores_per_socket: 'machdep.cpu.core_count',
                  threads_per_core: 'machdep.cpu.thread_count' }.freeze

        class << self
          # :logicalcount
          # :models
          # :physicalcount
          # :speed
          # :cores_per_socket
          # :threads_per_core

          private

          def post_resolve(fact_name, _options)
            @fact_list.fetch(fact_name) { read_processor_data(fact_name) }
          end

          def read_processor_data(fact_name)
            output = Facter::Core::Execution.execute("sysctl #{ITEMS.values.join(' ')}", logger: log)
            processors_hash = Hash[*output.split("\n").collect { |v| [v.split(': ')[0], v.split(': ')[1]] }.flatten]
            build_fact_list(processors_hash)
            @fact_list[fact_name]
          end

          def build_fact_list(hash)
            build_logical_count(hash)
            build_physical_count(hash)
            build_models(hash)
            build_speed(hash)
            build_cores_per_socket(hash)
            build_threads_per_core(hash)
          end

          def build_logical_count(hash)
            @fact_list[:logicalcount] = hash[ITEMS[:logical_count]].to_i
          end

          def build_physical_count(hash)
            @fact_list[:physicalcount] = hash[ITEMS[:physical_count]].to_i
          end

          def build_models(hash)
            @fact_list[:models] = Array.new(@fact_list[:logicalcount].to_i, hash[ITEMS[:brand]])
          end

          def build_speed(hash)
            @fact_list[:speed] = hash[ITEMS[:speed]].to_i
          end

          def build_cores_per_socket(hash)
            @fact_list[:cores_per_socket] = hash[ITEMS[:cores_per_socket]].to_i
          end

          def build_threads_per_core(hash)
            @fact_list[:threads_per_core] = hash[ITEMS[:threads_per_core]].to_i / hash[ITEMS[:cores_per_socket]].to_i
          end
        end
      end
    end
  end
end