class BitbucketServerClient

def create_pull_comment(slug, pull_id, body, path, position)

def create_pull_comment(slug, pull_id, body, path, position)
  url = "#{pull_requests_url(slug)}/#{pull_id}/comments"
  post(url, body, path, position)
end

def get(url, query)

def get(url, query)
  self.class.get(url, query: query).parsed_response
end

def initialize(username, password, endpoint)

def initialize(username, password, endpoint)
  self.class.base_uri(endpoint)
  self.class.basic_auth(username, password)
  @headers = { 'Content-Type' => 'application/json' }
end

def openstruct(response)

def openstruct(response)
  response.map { |r| OpenStruct.new(r) }
end

def paged_request(url, query = {})

def paged_request(url, query = {})
  Enumerator.new do |yielder|
    next_page_start = 0
    loop do
      response = get(url, query.merge(start: next_page_start))
      break if response['values'].nil?
      response['values'].each { |item| yielder << OpenStruct.new(item) }
      next_page_start = response['nextPageStart']
      break unless next_page_start
    end
  end
end

def post(url, body, path, position)

def post(url, body, path, position)
  body = {
    text: body,
    anchor: {
      line: position,
      lineType: 'ADDED',
      path: path,
      srcPath: path
    }
  }
  self.class.post(url, body: body.to_json, headers: @headers)
end

def pull_comments(slug, pull_id)

def pull_comments(slug, pull_id)
  url = "#{pull_requests_url(slug)}/#{pull_id}/activities"
  response = paged_request(url)
  response.select { |activity| activity.action == 'COMMENTED' }
end

def pull_requests(slug)

def pull_requests(slug)
  paged_request(pull_requests_url(slug), state: 'OPEN')
end

def pull_requests_url(slug)

def pull_requests_url(slug)
  project_key, repository_key = slug.split('/')
  "/projects/#{project_key}/repos/#{repository_key}/pull-requests"
end