class Pronto::Gitlab

def client

def client
  @client ||= ::Gitlab.client(endpoint: gitlab_api_endpoint,
                              private_token: gitlab_api_private_token)
end

def commit_comments(sha)

def commit_comments(sha)
  @comment_cache[sha.to_s] ||= begin
    client.commit_comments(slug, sha).auto_paginate.map do |comment|
      Comment.new(sha, comment.note, comment.path, comment.line)
    end
  end
end

def create_commit_comment(comment)

def create_commit_comment(comment)
  @config.logger.log("Creating commit comment on #{comment.sha}")
  client.create_commit_comment(slug, comment.sha, comment.body,
                               path: comment.path, line: comment.position,
                               line_type: 'new')
end

def create_pull_request_review(comments)

def create_pull_request_review(comments)
  return if comments.empty?
  comments.each do |comment|
    options = {
      body: comment.body,
      position: position_sha.dup.merge(
        new_path: comment.path,
        position_type: 'text',
        new_line: comment.position,
        old_line: nil,
      )
    }
    client.create_merge_request_discussion(slug, pull_id, options)
  end
end

def env_pull_id

def env_pull_id
  pull_request = super
  pull_request ||= ENV['CI_MERGE_REQUEST_IID']
  pull_request.to_i if pull_request
end

def gitlab_api_endpoint

def gitlab_api_endpoint
  @config.gitlab_api_endpoint
end

def gitlab_api_private_token

def gitlab_api_private_token
  @config.gitlab_api_private_token
end

def host

def host
  @host ||= URI.split(gitlab_api_endpoint)[2, 2].compact.join(':')
end

def position_sha

def position_sha
  # Better to get those informations from Gitlab API directly than trying to look for them here.
  # (FYI you can't use `pull` method because index api does not contains those informations)
  @position_sha ||= begin
                      data = client.merge_request(slug, pull_id)
                      data.diff_refs.to_h
                    end
end

def pull_comments(sha)

def pull_comments(sha)
  @comment_cache["#{slug}/#{pull_id}"] ||= begin
    arr = []
    client.merge_request_discussions(slug, pull_id).auto_paginate.each do |comment|
      comment.notes.each do |note|
        next unless note['position']
        arr << Comment.new(
          sha,
          note['body'],
          note['position']['new_path'],
          note['position']['new_line']
        )
      end
    end
    arr
  end
end

def pull_id

def pull_id
  env_pull_id || raise(Pronto::Error, "Unable to determine merge request id. Specify either `PRONTO_PULL_REQUEST_ID` or `CI_MERGE_REQUEST_IID`.")
end

def slug

def slug
  return @config.gitlab_slug if @config.gitlab_slug
  @slug ||= begin
    @repo.remote_urls.map do |url|
      match = slug_regex(url).match(url)
      match[:slug] if match
    end.compact.first
  end
end

def slug_regex(url)

def slug_regex(url)
  if url =~ %r{^ssh:\/\/}
    %r{.*#{host}(:[0-9]+)?(:|\/)(?<slug>.*).git}
  elsif url =~ /#{host}/
    %r{.*#{host}(:|\/)(?<slug>.*).git}
  else
    %r{\/\/.*?(\/)(?<slug>.*).git}
  end
end