module SvelteOnRails::Installer::Haml

def self.install_haml_and_convert

def self.install_haml_and_convert
  # install haml-rails
  puts '-' * 80
  gu = SvelteOnRails::GemUtils
  gu.install_gem('haml-rails')
  # check existing files
  existing_haml_files = Dir.glob('app/views/**/*.haml').select { |f| File.file? f }
  overwrite_files = []
  files = Dir.glob('app/views/**/*.html.erb').each_with_object([]) do |f, ary|
    new_file = f.gsub(/\.erb\z/, '.haml')
    if File.file? new_file
      overwrite_files += [new_file]
      existing_haml_files.delete(new_file)
    end
    if File.file? f
      ary << [
        f,
        new_file
      ]
    end
  end
  if files.empty?
    puts "No .erb files found, no conversion necessary."
    return
  end
  # ask if haml already exist
  if existing_haml_files.any?
    puts '-' * 80
    begin
      puts "Theare are already .haml files:"
      puts existing_haml_files
      puts "Would you like to continue? (y/n)"
      continue = STDIN.gets.chomp.downcase[0]
    end until ['y', 'n'].include?(continue)
    if continue == 'n'
      puts 'skipping convert to haml'
      return
    end
  end
  # ask if overwrite
  if overwrite_files.any?
    puts '-' * 80
    begin
      puts "The following files already exist and would be overwritten:"
      puts overwrite_files
      puts "Would you like to overwrite these .haml files? (y/n)"
      should_overwrite = STDIN.gets.chomp.downcase[0]
    end until ['y', 'n'].include?(should_overwrite)
  end
  puts '-' * 80
  # check for html2haml
  installed_html2haml = false
  if gu.check_gem_version('html2haml')
    puts "html2haml already installed, now converting..."
  else
    gu.install_gem('html2haml', group: 'development')
    installed_html2haml = true
  end
  # convert
  backup_dir = "svelte_on_rails_backup_views_#{Time.now.strftime('%Y%m%d_%H%M%S')}"
  FileUtils.mkdir_p(backup_dir)
  Dir.chdir(Rails.root) do
    files.each do |f|
      stdout, stderr, status = Open3.capture3("html2haml #{f.join(' ')}")
      if stderr.present?
        raise stderr
      else
        view_dir = File.dirname(f.first).to_s.match(/(?<=app\/views\/)(.*)/).to_s
        backup_view_dir = backup_dir + '/' + view_dir
        FileUtils.mkdir_p(backup_view_dir)
        FileUtils.mv(f.first, backup_view_dir)
        puts "Converted #{f.join(' => ')}"
      end
    end
  end
  if installed_html2haml
    system("bundle remove html2haml")
    if $?.success?
      puts "cleanup: removed html2haml from Gemfile"
    else
      puts "ERROR: failed to remove html2haml (please remove manually as it was only installed for this task)"
    end
  end
end