#!/usr/bin/env ruby
# frozen_string_literal: true

require "yaml"
require_relative '../lib/rsyntaxtree'
require_relative '../lib/rsyntaxtree/utils'

directory = nil
directory = ARGV[0] if File.exist? ARGV[0]
doc_dir = File.expand_path(directory || File.join(__dir__, "..", "docs"))
examples_dir = File.join(doc_dir, "_examples")
svg_dir = File.join(doc_dir, "assets", "svg")
png_dir = File.join(doc_dir, "assets", "img")

logfile = File.open(File.join(doc_dir, "generate_examples.log"), "w")

Dir.glob("*.md", base: examples_dir).map do |md|
  md = File.join(examples_dir, md)
  config = YAML.load_file(md)
  rst = File.read(md).scan(/```([^`]+)```/m).last.first
  begin
    RSyntaxTree::RSGenerator.check_data(rst)
  rescue StandardError
    logfile.puts "Error detected in #{md}"
  end

  opts = DEFAULT_OPTS.dup
  name = nil
  config.each do |key, value|
    next if value.to_s == ""

    case key
    when "name"
      name = value
      opts[:name] = name
    when "color"
      opts[:color] = case value
                     when "modern", "on", "true"
                       "modern"
                     when "traditional"
                       "traditional"
                     else
                       "off"
                     end
    when "linewidth", "line_width"
      opts[:linewidth] = value
    when "polyline"
      opts[:polyline] = value
    when "hide_default_connectors"
      opts[:hide_default_connectors] = value
    when "connector_height"
      opts[:vheight] = value
    when "symmetrization"
      opts[:symmetrize] = value
    when "connector"
      opts[:leafstyle] = value
    when "font"
      opts[:fontstyle] = case value
                         when /mono/i
                           "mono"
                         when /sans/i
                           "sans"
                         when /serif/i
                           "serif"
                         when /wqy/i
                           "cjk"
                         else
                           "sans"
                         end
    end
  end
  opts[:data] = rst
  rsg = RSyntaxTree::RSGenerator.new(opts)

  File.open(File.join(svg_dir, "#{name}.svg"), "w") do |f|
    logfile.puts "Creating svg file: #{name}.svg"
    svg = rsg.draw_svg
    f.write(svg)
  rescue StandardError => e
    logfile.puts "Processing #{name}.svg"
    logfile.puts e.message
  end

  File.open(File.join(png_dir, "#{name}.png"), "w") do |f|
    logfile.puts "Creating png file: #{name}.png"
    png = rsg.draw_png
    f.write(png)
  rescue StandardError => e
    logfile.puts "Processing #{name}.png"
    logfile.puts e.message
  end
end

logfile.close