# frozen_string_literal: true

module Paperwork
    ##
    # task generators for building with middleman
    module Tasks
        require "rake"

        ##
        # main task generator for building the document
        #
        class Document < Paperwork::Tasks::Base
            attr_reader :dir

            include Rake::DSL

            def initialize(name, sources, *dependencies)
                @dir = Paperwork::Tasks::Template.new(name).dir

                sources.each do |src|
                    dst = get_destination(File.join(self.dir, "source"), src)
                    BuildFile.new(dst, src)
                    dependencies << dst
                end

                dependencies << RootHelpers.new(@dir, sources.first).name
                super(name, *dependencies)
            end

            def tasks
                tasks_build
                tasks_nested
            end

            private

            def get_destination(dst_base, src) # rubocop:disable Metrics/AbcSize
                nested_base = File.dirname(src)
                if nested_base == "."
                    nested_base = dst_base
                else
                    nested_base = File.join(dst_base, nested_base)
                end

                ext = File.extname(src)
                case ext
                when ".md"
                    File.join(nested_base, File.basename(src)).gsub(".md", ".html.md")
                when ".scss"
                    Paperwork::Config[:custom_css] << File.basename(src, ext)
                    File.join(dst_base, "stylesheets", File.basename(src)).gsub(".scss", ".css.scss")
                when ".css"
                    Paperwork::Config[:custom_css] << File.basename(src, ext)
                    File.join(dst_base, "stylesheets", File.basename(src))
                when ".js"
                    Paperwork::Config[:custom_js] << File.basename(src, ext)
                    File.join(dst_base, "javascripts", File.basename(src))
                when ".yml"
                    File.join(dst_base, "..", "data", File.basename(src))
                else
                    File.join(dst_base, "images", File.basename(src))
                end
            end

            def tasks_build # rubocop:disable Metrics/AbcSize
                namespace :paperwork do
                    desc "build documentation for '#{self.name}'"
                    task self.name => self.dependencies do
                        verbose_flag = Paperwork::Config[:verbose] ? " --verbose" : ""
                        Dir.chdir(self.dir) do
                            Bundler.with_unbundled_env do
                                Process.spawn(
                                    "bundle exec middleman build#{verbose_flag}",
                                    out: :out,
                                    in: :in,
                                    err: :err
                                )
                            end
                            Process.waitall
                        end

                        puts
                        puts "...Done!"
                        puts "build artifacts are located in #{File.join(self.dir, "build")}"
                    end
                end
            end

            def tasks_nested # rubocop:disable Metrics/AbcSize
                namespace :paperwork do
                    namespace self.name do
                        task build: ["paperwork:#{self.name}"]

                        desc "rebuild documentation from scratch for '#{self.name}'"
                        task rebuild: [:clean, :build]

                        desc "build documentation for '#{self.name}' with verbose output"
                        task build_verbose: [:set_verbose, :build]

                        task :set_verbose do
                            Paperwork::Config[:verbose] = true
                        end

                        desc "clean documentation build directory for '#{self.name}'"
                        task :clean do
                            rm_rf self.dir
                        end
                    end
                end
            end
        end
    end
end