require_relative 'include_files/include_use_case'
require_relative '../../lib/string_helper'

namespace :build do

  def camelize(snake_case_string)
    snake_case_string.split('_').collect(&:capitalize).join
  end

  desc 'Build use case markdown'
  task :use_cases do
    # Page that links to use cases.
    File.open('use_cases.md', 'w') do |use_case_file|
      use_case_file.puts(<<EOT
# Use Cases

EOT
      )
      dir_path = File.dirname(__FILE__)
      Dir.chdir(dir_path) do
        IncludeUseCase.write_interface_file
        use_case_dirs = {
            :include_files => %w/
                reuse_text
                include_with_added_comments
                nest_inclusions
                include_markdown
                include_code_block
                include_highlighted_code
                include_text_as_comment
                include_text_as_pre
                include_generated_text
                diagnose_missing_includee
                diagnose_circular_includes
            /,
            :tables_of_contents => %w/
                create_and_include_page_toc
            /,
            # :resolve => %w/
                # resize_images
                # resolve_with_added_comments
                # gemify_images
            # /,
        }
        use_case_dirs.each_pair do |section, dir_names|

          # Header for section, if any dirs therein.
          title = StringHelper.to_title(section.to_s).sub(/ toc$/i, ' TOC')
          use_case_file.puts(<<EOT
## #{title}

EOT
) unless dir_names.empty?

          backtrace_cases = %w/
              diagnose_missing_includee
              diagnose_circular_includes
          /
          dir_names.each do |dir_name|
            Dir.chdir("#{section}/#{dir_name}") do
              # If the dir has a Ruby file, run it.
              ruby_file_path = "#{dir_name}.rb"
              if File.exist?(ruby_file_path)
                class_name = camelize(dir_name)
                command = "ruby -I . -r #{dir_name} -e #{class_name}.build"
                if backtrace_cases.include?(dir_name)
                  command += " 2> #{dir_name}.err"
                  begin
                    system(command)
                  rescue
                    #
                  ensure
                  end
                else
                  system(command)
                end
              end

              # If the dir has a use case file, link to it.
              use_case_file_path = 'use_case.md'
              unless File.exist?(use_case_file_path)
                message = "File #{dir_name}/use_case.md does not exist"
                warn(message)
                next
              end
              title_line = File.open(use_case_file_path).grep(/^#/).first.chomp
              title = title_line.split(/\s/, 2).pop
              use_case_file_name = File.basename(use_case_file_path)
              use_case_anchor = dir_name.gsub('_', '-')
              use_case_relative_url = File.join(
                  section.to_s,
                  dir_name,
                  use_case_file_name + '#' + use_case_anchor,
              )
              use_case_file.puts("* [#{title}](#{use_case_relative_url})")
            end
          end
        end
      end
    end
  end

end