module Asciidoctor::Html::CLI

def self.generate_bookopts(config)

def self.generate_bookopts(config)
  book_opts = {}
  %i[title short_title authors base_url chapname].each do |opt|
    key = opt.to_s
    book_opts[opt] = config[key] if config.include?(key)
  end
  book_opts[:short_title] ||= book_opts[:title]
  book_opts
end

def self.generate_webmanifest(outdir, name, short_name)

def self.generate_webmanifest(outdir, name, short_name)
  filename = "#{outdir}/#{FAVICON_PATH}/site.webmanifest"
  puts "Generating\n  #{filename}"
  puts
  File.write filename, Webmanifest.generate(name, short_name)
end

def self.parse_opts

def self.parse_opts
  options = DEFAULT_OPTIONS.dup
  OptionParser.new do |parser|
    parser.on("-w", "--watch",
              "Watch for file changes in SRCDIR. Default: unset")
    parser.on("-c", "--config-file CONFIG",
              "Location of config file. Default: #{options[:"config-file"]}")
  end.parse!(into: options)
  options
end

def self.read_config(config_file)

def self.read_config(config_file)
  begin
    config = Psych.safe_load_file config_file
  rescue StandardError
    puts "Error opening configuration file\n  #{config_file}"
    puts
    exit 1
  end
  config_dir = Pathname(config_file).dirname
  %w[outdir srcdir].each do |prop|
    config[prop] = File.expand_path(config[prop] || DEFAULT_DIRS[prop], config_dir)
  end
  %w[chapters appendices].each do |prop|
    config[prop] ||= []
    config[prop] = config[prop].map do |f|
      File.expand_path(f, config_dir)
    end
  end
  config
end

def self.run(opts = nil)

def self.run(opts = nil)
  opts ||= parse_opts
  config = read_config opts[:"config-file"]
  outdir = config["outdir"]
  srcdir = config["srcdir"]
  book_opts = generate_bookopts config
  setup_outdir srcdir, outdir
  generate_webmanifest outdir, book_opts[:title], book_opts[:short_title]
  book = Book.new book_opts
  puts "Writing book to\n  #{outdir}"
  puts
  book.write config["chapters"], config["appendices"], outdir, sitemap: true
  return unless opts[:watch]
  Filewatcher.new("#{srcdir}/*.adoc").watch do |changes|
    chapters = []
    appendices = []
    changes.each_key do |filename|
      puts "Detected change in\n  #{filename}"
      puts
      chapters.append(filename) if config["chapters"].include?(filename)
      appendices.append(filename) if config["appendices"].include?(filename)
    end
    puts "Regenerating book:"
    puts "  Chapters: #{chapters.map { |c| Pathname(c).basename }.join ", "}" unless chapters.empty?
    puts "  Appendices: #{appendices.map { |a| Pathname(a).basename }.join ", "}" unless appendices.empty?
    puts
    book.write chapters, appendices, config["outdir"]
  end
end

def self.setup_outdir(srcdir, outdir)

def self.setup_outdir(srcdir, outdir)
  assets_out = "#{outdir}/#{ASSETS_PATH}"
  FileUtils.mkdir_p assets_out unless File.directory?(assets_out)
  %W[#{IMG_PATH} #{CSS_PATH} #{FAVICON_PATH}].each do |p|
    dir = "#{srcdir}/#{p}"
    next unless Dir.exist?(dir)
    puts "Copying\n  #{dir}\nto\n  #{assets_out}"
    puts
    FileUtils.cp_r dir, assets_out
  end
  rootdir = File.absolute_path "#{__dir__}/../../.."
  %W[#{CSS_PATH} #{FAVICON_PATH}].each do |p|
    dir = "#{outdir}/#{p}"
    next if Dir.exist?(dir)
    puts "Putting default '#{p}' files in\n  #{dir}"
    puts
    FileUtils.cp_r "#{rootdir}/#{p}", assets_out
  end
end