# frozen_string_literal: true

ENV["RAILS_ENV"] ||= 'test'

namespace :karma do
  task start: :environment do |_task|
    with_tmp_config :start
  end

  task run: :environment do |_task|
    with_tmp_config :start, "--single-run"
  end

  private

  def with_tmp_config(command, args = nil)
    Tempfile.open('karma_unit.js', Rails.root.join('tmp') ) do |f|
      f.write unit_js(application_spec_files << i18n_file)
      f.flush
      trap('SIGINT') { puts "Killing Karma"; exit }
      exec "node_modules/.bin/karma #{command} #{f.path} #{args}"
    end
  end

  def application_spec_files
    sprockets = Rails.application.assets
    sprockets.append_path Rails.root.join("spec/javascripts")
    Rails.application.assets.find_asset("application_spec.js").to_a.map { |e| e.pathname.to_s }
  end

  def unit_js(files)
    puts files
    unit_js = File.read('config/ng-test.conf.js')
    unit_js.gsub "APPLICATION_SPEC", "\"#{files.join("\",\n\"")}\""
  end

  def i18n_file
    raise "I18n::JS module is missing" unless defined?(I18n::JS)

    I18n::JS::DEFAULT_EXPORT_DIR_PATH.replace('tmp/javascripts')
    I18n::JS.export
    Rails.root.join(I18n::JS::DEFAULT_EXPORT_DIR_PATH, 'translations.js').to_s
  end
end
