# vim: filetype=ruby require 'capistrano/dsl/opscomplete'

namespace :opscomplete do

include Capistrano::DSL::Opscomplete
# desc 'Validate opscomplete specific configuration'
task :validate do
  invoke('opscomplete:nodejs:check')
end

namespace :nodejs do
  desc 'Check if nodejs version is set according to application\'s .node-version or .nvmrc (in this order).'
  task :check do
    on roles fetch(:nodejs_roles, :all) do |host|
      warn("#{host}: Managed Node.js environment! Won't do any changes to nodejs version.") if managed_nodejs?
      unless capture(:nodejs_get_version, release_path) == app_nodejs_version
        validation_error!("#{host}: Node.js version is not set according to application\'s .node-version or .nvmrc file. Use cap opscomplete:nodejs:ensure.")
      end
      info("#{host}: Node.js #{app_nodejs_version} is installed.")
    end
  end

  desc 'Update Node.js version management tool'
  task :update_nodejs_build do
    on roles fetch(:nodejs_roles, :all) do
      execute :nodejs_update_management_tool
    end
  end

  desc 'Install and configure NodeJS according to applications .nvmrc, .node-version or .tool-versions.'
  task :ensure do
    invoke('opscomplete:nodejs:update_nodejs_build')
    on roles fetch(:nodejs_roles, :all) do |host|
      if managed_nodejs?
        validation_error!("#{host}: Managed Node.js environment! Won't do any changes to Node.js version.")
      end
      if nodejs_installed_versions.include?(app_nodejs_version)
        info("#{host}: Node.js #{app_nodejs_version} is installed.")
      elsif nodejs_installable_versions.include?(app_nodejs_version)
        info("#{host}: Configured Node.js version is not installed, but available for installation.")
        with tmpdir: fetch(:tmp_dir) do
          execute(:nodejs_install_version, "'#{app_nodejs_version}'")
        end
      else
        info("#{host}: Check if the configured Node.js version is part of the installable versions")
        execute :nodejs_installable_versions
        validation_error!("#{host}: Configured Node.js version is neither installed nor installable.")
      end
      execute(:nodejs_set_version, "'#{app_nodejs_version}'")
    end
  end
end

end