require 'capistrano'

module Rollbar
  # Deploy Tracking API wrapper module
  module Deploy
    ENDPOINT = 'https://api.rollbar.com/api/1/deploy/'.freeze

    def self.report(opts = {}, access_token:, environment:, revision:)
      return {} unless access_token && !access_token.empty?

      opts[:status] ||= :started

      uri = URI.parse(::Rollbar::Deploy::ENDPOINT)

      request = Net::HTTP::Post.new(uri.request_uri)
      request.body = ::JSON.dump({
        :access_token => access_token,
        :environment => environment,
        :revision => revision
      }.merge(opts))

      send_request(opts, :uri => uri, :request => request)
    end

    def self.update(opts = {}, deploy_id:, access_token:, status:)
      return {} unless access_token && !access_token.empty?

      uri = URI.parse(
        ::Rollbar::Deploy::ENDPOINT +
        deploy_id.to_s +
        '?access_token=' + access_token
      )

      request = Net::HTTP::Patch.new(uri.request_uri)
      request.body = ::JSON.dump(:status => status.to_s, :comment => opts[:comment])

      send_request(opts, :uri => uri, :request => request)
    end

    class << self
      private

      def send_request(opts = {}, uri:, request:)
        Net::HTTP.start(uri.host, uri.port, opts[:proxy], :use_ssl => true) do |http|
          build_result(
            :uri => uri,
            :request => request,
            :response => opts[:dry_run] ? nil : http.request(request)
          )
        end
      end

      def build_result(uri:, request:, response: nil)
        result = {
          :request_info => uri.inspect + ': ' + request.body,
          :request => request,
          :response => response
        }

        unless result[:response].nil?
          result.merge!(JSON.parse(result[:response].body, :symbolize_names => true))
          result[:response_info] = build_response_info(result[:response])
        end

        result
      end

      def build_response_info(response)
        response.code + '; ' + response.message + '; ' + response.body.delete!("\n")
      end
    end
  end
end