#!/usr/bin/ruby.ruby3.4 
# encoding: UTF-8

require 'bundler/setup'

require 'image_optim'

README_FILE = File.expand_path('../../README.markdown', __FILE__)
BEGIN_MARKER = '<!---<worker-options>-->'.freeze
END_MARKER = '<!---</worker-options>-->'.freeze

def write_worker_options(io, klass)
  io.puts "### #{klass.bin_sym}:"
  if klass.option_definitions.empty?
    io.puts 'Worker has no options'
  else
    klass.option_definitions.each do |option_definition|
      line = "* `:#{option_definition.name}` — #{option_definition.description}"
      unless line['(defaults']
        line << " *(defaults to #{option_definition.default_description})*"
      end
      io.puts line
    end
  end
  io.puts
end

def write_marked(io)
  io.puts BEGIN_MARKER
  io.puts '<!-- markdown for worker options is generated by '\
    "`#{Pathname($PROGRAM_NAME).cleanpath}` -->"
  io.puts

  ImageOptim::Worker.klasses.sort_by(&:name).each do |klass|
    write_worker_options(io, klass)
  end

  io.puts END_MARKER
end

def update_readme(text)
  marked_reg = /#{Regexp.escape(BEGIN_MARKER)}.*#{Regexp.escape(END_MARKER)}/m
  text.clone.sub!(marked_reg) do
    StringIO.open do |io|
      write_marked(io)

      io.string.strip
    end
  end
end

readme = File.read(README_FILE)
if (readme = update_readme(readme))
  File.open(README_FILE, 'w') do |f|
    f.write readme
  end
else
  abort 'Did not update worker options'
end
