# frozen_string_literal: true

# Returns the path to the manifest file # # @return [Pathname] # def rake_task_config_manifest_filename

Mimi.app_path_to('config', 'manifest.yml')

end

# Displays current manifest and configured values in .env format # # @param include_consts [true,false] include non-configurable parameters (consts) # def rake_task_config(include_consts = false)

manifest = Mimi::Config.load_manifest(rake_task_config_manifest_filename)
missing_params = manifest.keys.select { |k| manifest.required?(k) }.reject { |k| ENV.key?(k.to_s) }

manifest.to_h.each do |name, props|
  next if props[:const] && !include_consts
  annotation = []
  if props[:const]
    annotation << '[CONST]'
    annotation << "(value: #{props[:default].inspect})"
  elsif missing_params.include?(name)
    annotation << "[MISSING] (#{props[:type]})"
  else
    annotation << "(#{props[:type]}, default: #{props[:default].inspect})"
  end
  annotation << props[:desc] if props.key?(:desc)
  annotation.unshift('  #') unless annotation.empty?
  puts "#{name}=#{ENV[name.to_s]}#{annotation.join(' ')}"
end
abort('# FIXME: configure missing parameters') unless missing_params.empty?

end

# Generates a new/updated config manifest # # @return [String] a config manifest in the YAML format # def rake_task_config_manifest_generate

manifest = Mimi::Core::Manifest.new({})

# merge loaded modules manifests
Mimi.loaded_modules.map(&:manifest).each do |manifest_hash|
  manifest.merge!(manifest_hash)
end

# merge app's explicit manifest
app_manifest = Mimi::Config.load_manifest(rake_task_config_manifest_filename)
manifest.merge!(app_manifest)

manifest.to_yaml

end

desc 'Display config manifest and current config' task :config do

rake_task_config(false)

end

namespace :config do

desc 'Display config manifest and current config, including consts'
task :all do
  rake_task_config(true)
end

desc 'Generate and display a combined manifest for all loaded modules'
task :manifest do
  puts rake_task_config_manifest_generate
end

namespace :manifest do
  manifest_filename = Pathname.pwd.join('config', 'manifest.yml')
  desc "Generate and write a combined manifest to: #{manifest_filename}"
  task :create do
    if File.exist?(manifest_filename)
      puts "* Found an existing application manifest, loading: #{manifest_filename}"
    end
    puts '* Generating a combined manifest'
    manifest_contents = rake_task_config_manifest_generate
    config_path = Mimi.app_path_to('config')
    puts "* Writing the combined manifest to: #{manifest_filename}"
    sh "install -d #{config_path}" unless File.directory?(config_path)
    File.open(rake_task_config_manifest_filename, 'w') do |f|
      f.puts manifest_contents
    end
  end
end

end