# frozen_string_literal: true

namespace :openapi3 do

desc 'combine YAML files'
task combine: :environment do
  schema = {}
  schema.merge! YAML.load_file(Rails.root.join('docs', 'openapi3', 'meta.yaml'))

  schema['paths'] = {}

  Dir[Rails.root.join('docs', 'openapi3', 'paths', '**', '*.yaml')].sort.each do |path|
    $stdout.puts "merge #{path}"
    schema['paths'].merge!(YAML.load_file(path) || {})
  rescue StandardError => e
    $stdout.puts "error #{path}: #{e.message}"
    exit
  end

  schema['components'] = {}

  schema['components']['parameters'] = {}
  Dir[Rails.root.join('docs', 'openapi3', 'components', 'parameters', '**', '*.yaml')].sort.each do |path|
    $stdout.puts "merge #{path}"
    schema['components']['parameters'].merge!(YAML.load_file(path) || {})
  rescue StandardError => e
    $stdout.puts "error #{path}: #{e.message}"
    exit
  end

  schema['components']['schemas'] = {}
  Dir[Rails.root.join('docs', 'openapi3', 'components', 'schemas', '**', '*.yaml')].sort.each do |path|
    $stdout.puts "merge #{path}"
    schema['components']['schemas'].merge!(YAML.load_file(path) || {})
  rescue StandardError => e
    $stdout.puts "error #{path}: #{e.message}"
    exit
  end

  schema['paths'] = Hash[schema['paths'].sort_by { |k, _| k }]
  schema['components']['parameters'] = Hash[schema['components']['parameters'].sort_by { |k, _| k }]
  schema['components']['schemas'] = Hash[schema['components']['schemas'].sort_by { |k, _| k }]

  dest = Rails.root.join('docs', 'schema.yaml')

  File.open(dest, 'wb+') do |io|
    io.write YAML.dump(schema)
  end

  $stdout.puts "Update file: #{dest}"
end

desc 'verify YAML files'
task verify: :environment do
  # implement later
end

desc 'update schema'
task update: %w[openapi3:verify openapi3:combine]

end