class Envirobly::Api

def api_url_for(path, query: nil)

def api_url_for(path, query: nil)
  URI::HTTPS.build(host: HOST, path: "/api/#{path}", query:)
end

def api_v1_accounts_url

def api_v1_accounts_url
  api_url_for "v1/accounts"
end

def api_v1_deployments_url

def api_v1_deployments_url
  api_url_for "v1/deployments"
end

def api_v1_instance_types_url(region)

def api_v1_instance_types_url(region)
  api_url_for "v1/instance_types", query: "region=#{region}"
end

def api_v1_regions_url

def api_v1_regions_url
  api_url_for "v1/regions"
end

def api_v1_service_shell_connections_url

def api_v1_service_shell_connections_url
  api_url_for "v1/service_shell_connections"
end

def api_v1_shape_validations_url

def api_v1_shape_validations_url
  api_url_for "v1/shape_validations"
end

def authorization_headers

def authorization_headers
  { "Authorization" => @access_token.as_http_bearer }
end

def create_deployment(params)

def create_deployment(params)
  post_as_json(api_v1_deployments_url, params:, headers: authorization_headers)
end

def create_service_shell_connection(params)

def create_service_shell_connection(params)
  post_as_json(api_v1_service_shell_connections_url, params:, headers: authorization_headers)
end

def default_headers

def default_headers
  { "User-Agent" => USER_AGENT, "X-Cli-Host" => Socket.gethostname }
end

def get_as_json(url, headers: {})

def get_as_json(url, headers: {})
  request(url, type: Net::HTTP::Get, headers:)
end

def get_deployment_with_delay_and_retry(url, tries = 1)

def get_deployment_with_delay_and_retry(url, tries = 1)
  sleep SHORT_RETRY_INTERVAL * tries
  response = get_as_json URI(url)
  if response.success?
    response
  elsif MAX_RETRIES <= tries
    $stderr.puts "Max retries exhausted while waiting for deployment credentials. Aborting."
    exit 1
  else
    if tries > 3
      sleep LONG_RETRY_INTERVAL
    else
      sleep SHORT_RETRY_INTERVAL
    end
    get_deployment_with_delay_and_retry(url, tries + 1)
  end
end

def initialize(access_token: Envirobly::AccessToken.new, exit_on_error: true)

def initialize(access_token: Envirobly::AccessToken.new, exit_on_error: true)
  @exit_on_error = exit_on_error
  @access_token = access_token
end

def list_accounts

def list_accounts
  get_as_json api_v1_accounts_url, headers: authorization_headers
end

def list_instance_types(region)

def list_instance_types(region)
  get_as_json api_v1_instance_types_url(region), headers: authorization_headers
end

def list_regions

def list_regions
  get_as_json api_v1_regions_url, headers: authorization_headers
end

def post_as_json(url, params: {}, headers: {})

def post_as_json(url, params: {}, headers: {})
  request(url, type: Net::HTTP::Post, headers:) do |request|
    request.body = params.to_json
  end
end

def put_as_json(url, params: {}, headers: {})

def put_as_json(url, params: {}, headers: {})
  request(url, type: Net::HTTP::Put, headers:) do |request|
    request.body = params.to_json
  end
end

def request(url, type:, headers: {})

def request(url, type:, headers: {})
  uri = URI(url)
  http = Net::HTTP.new uri.host, uri.port
  http.use_ssl = true
  http.open_timeout = 10
  http.read_timeout = 10
  headers = default_headers.merge headers
  request = type.new(uri, headers)
  request.content_type = CONTENT_TYPE
  yield request if block_given?
  http.request(request).tap do |response|
    def response.object
      @json_parsed_body ||= JSON.parse(body)
    rescue
      @json_parsed_body = { error_message: body }
    end
    def response.success?
      (200..299).include?(code.to_i)
    end
    if @exit_on_error && !response.success? && response.object["error_message"].present?
      puts response.object["error_message"] # TODO: Replace with shell.say_error
      exit 1
    end
  end
end

def validate_shape(params)

def validate_shape(params)
  post_as_json(api_v1_shape_validations_url, params:, headers: authorization_headers).tap do |response|
    unless response.success?
      $stderr.puts "Validation request responded with #{response.code}. Aborting."
      exit 1
    end
  end
end