# *******************************************************************************
# OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# (1) Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# (2) Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# (3) Neither the name of the copyright holder nor the names of any contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission from the respective party.
#
# (4) Other than as required in clauses (1) and (2), distributions in any form
# of modifications or other derivative works may not use the "OpenStudio"
# trademark, "OS", "os", or any other confusingly similar designation without
# specific prior written permission from Alliance for Sustainable Energy, LLC.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
# UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
# THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# *******************************************************************************

# Reports out information about the gem path and gems that are available and loaded.
# Used for debugging different runtime environments.
# Messages are put to stdout and returned in a hash.
# @return [Hash] a hash of information about the gems.
def gem_env_information
  require 'json'

  result = {}

  # Environment variables
  result[:env] = {}
  ENV.each do |k, v|
    vals = []
    v.split(';').each do |sub_v|
      vals << sub_v
    end
    result[:env][k] = vals
  end

  # Ruby executable
  require 'rbconfig'
  result[:rb_config] = RbConfig::CONFIG

  # Rubygems info
  require 'rubygems'
  require 'rubygems/version'
  result[:gem] = {}
  result[:gem][:version] = Gem::VERSION
  # result[:gem][:config_file] = Gem.config_file
  # result[:gem][:default_bindir] = Gem.default_bindir
  # result[:gem][:default_cert_path] = Gem.default_cert_path
  # result[:gem][:default_dir] = Gem.default_dir
  # result[:gem][:default_exec_format] = Gem.default_exec_format
  # result[:gem][:default_key_path] = Gem.default_key_path
  # result[:gem][:default_path] = Gem.default_path
  # result[:gem][:default_rubygems_dirs] = Gem.default_rubygems_dirs
  # result[:gem][:default_sources] = Gem.default_sources
  result[:gem][:dir] = Gem.dir
  # result[:gem][:host] = Gem.host
  result[:gem][:path] = Gem.path
  # result[:gem][:path_separator] = Gem.path_separator
  # result[:gem][:platforms] = Gem.platforms
  # result[:gem][:ruby] = Gem.ruby
  # result[:gem][:ruby_engine] = Gem.ruby_engine
  # result[:gem][:ruby_version] = Gem.ruby_version
  # result[:gem][:rubygems_version] = Gem.rubygems_version
  # result[:gem][:sources] = Gem.sources
  # result[:gem][:suffix_pattern] = Gem.suffix_pattern
  # result[:gem][:suffixes] = Gem.suffixes
  result[:gem][:user_dir] = Gem.user_dir
  result[:gem][:user_home] = Gem.user_home
  # result[:gem][:win_platform] = Gem.win_platform?

  # Available Gems
  result[:gem_specs_in_path] = {}
  local_gems = Gem::Specification.sort_by { |g| [g.name.downcase, g.version] }.group_by(&:name)
  local_gems.each do |name, specs|
    versions = []
    specs.sort.each do |spec|
      versions << "- #{spec.version} from #{spec.spec_dir}"
    end
    result[:gem_specs_in_path][name] = versions
  end

  # Loaded Gems
  result[:gem_specs_loaded] = {}
  loaded_gems = Gem.loaded_specs.sort_by { |g| g[0] }
  loaded_gems.each do |name, spec|
    result[:gem_specs_loaded][name] = ["- #{spec.version} from #{spec.spec_dir}"]
  end

  pretty_result = JSON.pretty_generate(result)

  puts pretty_result

  return result
end