# frozen_string_literal: true

require "bundler/gem_tasks"
require "rspec/core/rake_task"
require "generators/decidim/app_generator"
require "generators/decidim/docker_generator"
require "decidim/dev"

load "decidim-dev/lib/tasks/test_app.rake"

DECIDIM_GEMS = %w(core system admin api participatory_processes assemblies pages meetings proposals comments accountability budgets surveys dev).freeze

RSpec::Core::RakeTask.new(:spec)

task default: :spec

desc "Runs all tests in all Decidim engines"
task :test_all do
  tested_gems = DECIDIM_GEMS - ["dev"]

  dirs = [__dir__] + tested_gems.map { |name| "#{__dir__}/decidim-#{name}" }

  dirs.each do |dir|
    Dir.chdir(dir) do
      puts "Running #{File.basename(dir)}'s tests..."
      status = system "rake"
      abort unless status || ENV["FAIL_FAST"] == "false"
    end
  end
end

def replace_file(name, regexp, replacement)
  new_content = File.read(name).gsub(regexp, replacement)

  File.open(name, "w") { |f| f.write(new_content) }
end

desc "Update version in all gems to the one set in the `.decidim-version` file"
task :update_versions do
  version = File.read("#{__dir__}/.decidim-version").strip

  replace_file(
    "#{__dir__}/package.json",
    /^  "version": "[^"]*"/,
    "  \"version\": \"#{version}\""
  )

  replace_file(
    "#{__dir__}/package-lock.json",
    /^  "version": "[^"]*"/,
    "  \"version\": \"#{version}\""
  )

  DECIDIM_GEMS.each do |gem_name|
    replace_file(
      "#{__dir__}/decidim-#{gem_name}/lib/decidim/#{gem_name}/version.rb",
      /def self\.version(\s*)"[^"]*"/,
      "def self.version\\1\"#{version}\""
    )
  end

  replace_file(
    "#{__dir__}/lib/decidim/version.rb",
    /def self\.version(\s*)"[^"]*"/,
    "def self.version\\1\"#{version}\""
  )
end

desc "Installs all gems locally."
task :install_all do
  sh "rake install", verbose: false
  DECIDIM_GEMS.each do |gem_name|
    Dir.chdir("#{__dir__}/decidim-#{gem_name}") do
      sh "rake install", verbose: false
    end
  end
end

desc "Pushes a new build for each gem."
task release_all: [:update_versions, :check_locale_completeness, :webpack] do
  sh "rake release"
  DECIDIM_GEMS.each do |gem_name|
    Dir.chdir("#{__dir__}/decidim-#{gem_name}") do
      sh "rake release"
    end
  end
end

desc "Makes sure all official locales are complete and clean."
task :check_locale_completeness do
  system({ "ENFORCED_LOCALES" => "en,ca,es" }, "rspec spec/i18n_spec.rb")
end

desc "Generates a development app."
task :development_app do
  Dir.chdir(__dir__) do
    sh "rm -fR development_app", verbose: false
  end

  Bundler.with_clean_env do
    Decidim::Generators::AppGenerator.start(
      ["development_app", "--path", "..", "--recreate_db", "--seed_db", "--demo"]
    )
  end
end

desc "Generates a development app based on Docker."
task :docker_development_app do
  Dir.chdir(__dir__) do
    sh "rm -fR docker_development_app"
  end

  path = __dir__ + "/docker_development_app"

  Bundler.with_clean_env do
    Decidim::Generators::DockerGenerator.start(
      ["docker_development_app", "--path", path]
    )
  end
end

desc "Build webpack bundle files"
task webpack: ["npm:install"] do
  sh "npm run build:prod"
end

desc "Install npm dependencies"
task "npm:install" do
  sh "npm i"
end