namespace :hamlit do
  desc 'Convert erb to haml in app/views'
  task :erb2haml do
    begin
      gem 'html2haml'
    rescue LoadError
      puts "html2haml gem is not part of the bundle."
      puts "`rake hamlit:erb2haml` requires html2haml gem to convert erb files."
      puts
      puts "Please add html2haml gem temporarily and run `rake hamlit:erb2haml` again."
      puts "(You can remove html2haml gem after the conversion.)"
      exit 1
    end

    erb_files = Dir.glob('app/views/**/*.erb').select(&File.method(:file?))
    if erb_files.empty?
      puts 'No .erb files found. Skipping.'
      next
    end

    haml_files_in_erb = Dir.glob('app/views/**/*.haml').select(&File.method(:file?)).map do |name|
      name.sub(/\.haml\z/, '.erb')
    end
    existing_files = erb_files.select(&haml_files_in_erb.method(:include?))

    if existing_files.any?
      puts 'Some of your .erb files seem to have .haml equivalents:'
      existing_files.map { |f| puts "  #{f}" }
      puts

      begin
        print 'Do you want to overwrite them? (y/n): '
        answer = STDIN.gets.strip.downcase[0]
      end until ['y', 'n'].include?(answer)

      if answer == 'n'
        if (erb_files - existing_files).empty?
          puts 'No .erb files to convert. Skipping.'
          next
        end
      else
        existing_files.each { |file| File.delete(file.sub(/\.erb\z/, '.haml')) }
      end
    end
    puts

    erb_files.each do |file|
      puts "Generating .haml for #{file}..."
      unless system("html2haml #{file} #{file.sub(/\.erb\z/, '.haml')}")
        abort "Failed to execute `html2haml #{file} #{file.sub(/\.erb\z/, '.haml')}`!"
      end
    end
    puts

    begin
      print 'Do you want to delete original .erb files? (y/n): '
      answer = STDIN.gets.strip.downcase[0]
    end until ['y', 'n'].include?(answer)

    if answer == 'y'
      puts 'Deleting original .erb files...'
      File.delete(*erb_files)
      erb_files.each { |file| puts "  #{file}" }
    end
    puts

    puts 'Finished to convert erb files.'
  end
end
