namespace :rocketdeploy do

task :collect_env do
  @data = {
    #local_user: fetch(:local_user),
    git_user: `git config user.name`,
    git_email: `git config user.email`,
    branch: fetch(:branch),
    commit_hash: fetch(:current_revision, "HEAD"),
    stage: fetch(:stage),
    environment: fetch(:rails_env),
    repo_url: fetch(:repo_url),
    hosts: [],
  }
end

task :notify_deploy_started => [:collect_env] do
  data = @data
  on roles(:app) do |host|
    host_url = "#{host&.user}.#{host&.hostname}"
    data[:hosts].push(host_url)
  end

  client = fetch(:rocketdeploy_client)
  r = client.deploy_started(@data)
  if r.nil?
    raise "response of rocketdeploy is nil"
  else
    @deploy_id = r['id']
  end
end

task :notify_deploy_finished do
  client = fetch(:rocketdeploy_client)
  if @deploy_id.nil?
    puts "RocketDeploy: no deploy_id, cant report"
  else
    client.deploy_finished(@deploy_id)
  end
end

task :notify_deploy_failed do
  client = fetch(:rocketdeploy_client)
  if @deploy_id.nil?
    puts "RocketDeploy: no deploy_id, cant report"
  else
    client.deploy_failed(@deploy_id)
  end
end

puts "install rocketdeploy cap tasks"
#before "deploy:check:directories", "rocketdeploy:notify_deploy_started"
after "git:set_current_revision", "rocketdeploy:notify_deploy_started"
after "deploy:finished", "rocketdeploy:notify_deploy_finished"
before "deploy:failed", "rocketdeploy:notify_deploy_failed"
before "deploy:reverted", "rocketdeploy:notify_deploy_failed"

end

namespace :load do

task :defaults do
  set(:rocketdeploy_client, -> {
    base_url = fetch(:rocketdeploy_server) || "https://rocketdeploy.ru/"
    token = fetch(:rocketdeploy_token)
    Capistrano::Rocketdeploy::Client.new(base_url, token)
  })
end

end