require 'git'

namespace :swagger_ui do

namespace :dist do
  desc 'Update Swagger-UI from wordnik/swagger-ui.'
  task :update do
    Dir.mktmpdir 'swagger-ui' do |dir|
      puts "Cloning into #{dir} ..."
      # clone wordnik/swagger-ui
      Git.clone 'git@github.com:wordnik/swagger-ui.git', 'swagger-ui', path: dir, depth: 0
      # prune local files
      root = File.expand_path '../../..', __FILE__
      puts "Removing files from #{root} ..."
      repo = Git.open root
      # Javascripts
      puts 'Copying Javascripts ...'
      FileUtils.rm_r "#{root}/app/assets/javascripts/grape_swagger_rails"
      FileUtils.cp_r "#{dir}/swagger-ui/dist/lib", "#{root}/app/assets/javascripts"
      FileUtils.mv "#{root}/app/assets/javascripts/lib", "#{root}/app/assets/javascripts/grape_swagger_rails"
      FileUtils.cp_r Dir.glob("#{dir}/swagger-ui/dist/swagger-ui.min.js"), "#{root}/app/assets/javascripts/grape_swagger_rails"
      FileUtils.cp Dir.glob("#{root}/lib/javascripts/*.js"), "#{root}/app/assets/javascripts/grape_swagger_rails"
      # Generate application.js
      JAVASCRIPT_FILES = [
        'jquery-1.8.0.min.js',
        'jquery.slideto.min.js',
        'jquery.wiggle.min.js',
        'jquery.ba-bbq.min.js',
        'handlebars-2.0.0.js',
        'marked.js',
        'lodash.min.js',
        'backbone-min.js',
        'swagger-ui.min.js',
        'highlight.9.1.0.pack.js',
        'js-yaml.min.js',
        'jsoneditor.min.js',
        'object-assign-pollyfill.js',
        'swagger-oauth.js',
        'base64.js'
      ].freeze
      javascript_files = Dir["#{root}/app/assets/javascripts/grape_swagger_rails/*.js"].map { |f|
        f.split('/').last
      } - ['application.js']
      (javascript_files - JAVASCRIPT_FILES).each do |filename|
        puts "WARNING: add #{filename} to swagger_ui.rake"
      end
      (JAVASCRIPT_FILES - javascript_files).each do |filename|
        puts "WARNING: remove #{filename} from swagger_ui.rake"
      end
      File.open "#{root}/app/assets/javascripts/grape_swagger_rails/application.js", 'w+' do |file|
        JAVASCRIPT_FILES.each do |filename|
          file.write "//= require ./#{File.basename(filename, '.*')}\n"
        end
      end
      # Stylesheets
      puts 'Copying Stylesheets ...'
      repo.remove 'app/assets/stylesheets/grape_swagger_rails', recursive: true
      FileUtils.mkdir_p "#{root}/app/assets/stylesheets/grape_swagger_rails"
      FileUtils.cp_r Dir.glob("#{dir}/swagger-ui/dist/css/**/*"), "#{root}/app/assets/stylesheets/grape_swagger_rails"
      repo.add 'app/assets/stylesheets/grape_swagger_rails'
      # Generate application.js
      CSS_FILES = [
        'reset.css',
        'screen.css'
      ].freeze
      css_files = Dir["#{root}/app/assets/stylesheets/grape_swagger_rails/*.css"].map { |f|
        f.split('/').last
      } - ['application.css']
      (css_files - CSS_FILES).each do |filename|
        puts "WARNING: add #{filename} to swagger_ui.rake"
      end
      (CSS_FILES - css_files).each do |filename|
        puts "WARNING: remove #{filename} from swagger_ui.rake"
      end
      # rewrite screen.css into screen.css.erb with dynamic image paths
      File.open "#{root}/app/assets/stylesheets/grape_swagger_rails/screen.css.erb", 'w+' do |file|
        contents = File.read "#{root}/app/assets/stylesheets/grape_swagger_rails/screen.css"
        contents.gsub! /url\((\'*).*\/(?<filename>[\w\.]*)(\'*)\)/ do |_match|
          "url(<%= image_path('grape_swagger_rails/#{$LAST_MATCH_INFO[:filename]}') %>)"
        end
        file.write contents
        FileUtils.rm "#{root}/app/assets/stylesheets/grape_swagger_rails/screen.css"
      end
      File.open "#{root}/app/assets/stylesheets/grape_swagger_rails/application.css", 'w+' do |file|
        file.write "/*\n"
        CSS_FILES.each do |filename|
          file.write "*= require ./#{File.basename(filename, '.*')}\n"
        end
        file.write "*= require_self\n"
        file.write "*/\n"
      end
      # Images
      puts 'Copying Images ...'
      repo.remove 'app/assets/images/grape_swagger_rails', recursive: true
      FileUtils.mkdir_p "#{root}/app/assets/images/grape_swagger_rails"
      FileUtils.cp_r Dir.glob("#{dir}/swagger-ui/dist/images/**/*"), "#{root}/app/assets/images/grape_swagger_rails"
      repo.add 'app/assets'
    end
  end
end

end