namespace :ndenv do

task :validate do
  on release_roles(fetch(:ndenv_roles)) do
    ndenv_node = fetch(:ndenv_node)
    if ndenv_node.nil?
      error "ndenv: ndenv_node is not set"
      exit 1
    end

    unless test "[ -d #{fetch(:ndenv_node_dir)} ]"
      error "ndenv: #{ndenv_node} is not installed or not found in #{fetch(:ndenv_node_dir)}"
      exit 1
    end
  end
end

task :map_bins do
  SSHKit.config.default_env.merge!({ ndenv_root: fetch(:ndenv_path), ndenv_version: fetch(:ndenv_node) })
  ndenv_prefix = fetch(:ndenv_prefix, proc { "#{fetch(:ndenv_path)}/bin/ndenv exec" })
  SSHKit.config.command_map[:ndenv] = "#{fetch(:ndenv_path)}/bin/ndenv"

  fetch(:ndenv_map_bins).each do |command|
    SSHKit.config.command_map.prefix[command.to_sym].unshift(ndenv_prefix)
  end
end

end

Capistrano::DSL.stages.each do |stage|

after stage, 'ndenv:validate'
after stage, 'ndenv:map_bins'

end

namespace :load do

task :defaults do
  set :ndenv_path, -> {
    ndenv_path = fetch(:ndenv_custom_path)
    ndenv_path ||= if fetch(:ndenv_type, :user) == :system
      "/usr/local/ndenv"
    else
      "$HOME/.ndenv"
    end
  }

  set :ndenv_roles, fetch(:ndenv_roles, :all)

  set :ndenv_node_dir, -> { "#{fetch(:ndenv_path)}/versions/#{fetch(:ndenv_node)}" }
  set :ndenv_map_bins, %w{npm node}
end

end