# frozen_string_literal: true

# Capistrano hook will not be run with no settings. # # You can setting the variables shown below. # # set :webhook_url, 'yulii.github.io' # set :webhook_starting_payload, { text: 'Now, deploying…' } # set :webhook_finished_payload, { text: 'Deployment has been completed!' } # set :webhook_failed_payload, { text: 'Oops! something went wrong.' } # set :webhook_reverting_payload, { text: 'Reverting…' } # set :webhook_rollbacked_payload, { text: 'Rollback has been completed!' }

namespace :webhook do

def webhook(url, payload, headers = {})
  return if url.nil? || payload.nil? || payload.empty?

  info "POST #{url} payload='#{payload}'"
  result = Capistrano::Hook::Web.client(url, headers).post(payload)
  message = "HTTP #{result.code} #{result.message} body='#{result.body}'; "
  if result.is_a?(Net::HTTPSuccess)
    info message
  else
    error message
  end
end

namespace :config do
  desc 'List the webhook configured variables'
  task :list do
    run_locally do
      keys = %i[webhook_url
                webhook_http_headers
                webhook_starting_payload
                webhook_finished_payload
                webhook_failed_payload
                webhook_reverting_payload
                webhook_rollbacked_payload].sort
      padding = keys.max_by(&:length).length
      keys.each do |key|
        next if fetch(key).nil? || fetch(key).empty?

        puts ":#{key.to_s.ljust(padding)} => #{fetch(key)}"
      end
    end
  end
end

namespace :post do
  desc 'Post a starting message if :webhook_url and :webhook_starting_payload are present'
  task :starting do
    run_locally do
      url     = fetch(:webhook_url)
      payload = fetch(:webhook_starting_payload)
      headers = fetch(:webhook_http_headers)
      webhook(url, payload, headers)
    end
  end

  desc 'Post a finished message if :webhook_url and :webhook_finished_payload are present'
  task :finished do
    run_locally do
      url     = fetch(:webhook_url)
      payload = fetch(:webhook_finished_payload)
      headers = fetch(:webhook_http_headers)
      webhook(url, payload, headers)
    end
  end

  desc 'Post a failed message if :webhook_url and :webhook_failed_payload are present'
  task :failed do
    run_locally do
      url     = fetch(:webhook_url)
      payload = fetch(:webhook_failed_payload)
      headers = fetch(:webhook_http_headers)
      webhook(url, payload, headers)
    end
  end

  desc 'Post a reverting message if :webhook_url and :webhook_reverting_payload are present'
  task :reverting do
    run_locally do
      url     = fetch(:webhook_url)
      payload = fetch(:webhook_reverting_payload)
      headers = fetch(:webhook_http_headers)
      webhook(url, payload, headers)
    end
  end

  desc 'Post a rollbacked message if :webhook_url and :webhook_rollbacked_payload are present'
  task :rollbacked do
    run_locally do
      url     = fetch(:webhook_url)
      payload = fetch(:webhook_rollbacked_payload)
      headers = fetch(:webhook_http_headers)
      webhook(url, payload, headers)
    end
  end

  before 'deploy:starting',           'webhook:post:starting'
  after  'deploy:finishing',          'webhook:post:finished'
  after  'deploy:failed',             'webhook:post:failed'
  before 'deploy:reverting',          'webhook:post:reverting'
  after  'deploy:finishing_rollback', 'webhook:post:rollbacked'
end

end