class Geet::Github::User

def self.authenticated(api_interface)

def self.authenticated(api_interface)
  api_path = '/user'
  response = T.cast(api_interface.send_request(api_path), T::Hash[String, T.untyped])
  login = T.cast(response.fetch('login'), String)
  new(login, api_interface)
end

def self.list_collaborators(api_interface)

def self.list_collaborators(api_interface)
  api_path = 'collaborators'
  response = T.cast(api_interface.send_request(api_path, multipage: true), T::Array[T::Hash[String, T.untyped]])
  response.map do |user_entry|
    login = T.cast(user_entry.fetch('login'), String)
    new(login, api_interface)
  end
end

def self.repo_permission(api_interface)

def self.repo_permission(api_interface)
  username = authenticated(api_interface).username
  api_path = "collaborators/#{username}/permission"
  response = T.cast(api_interface.send_request(api_path), T::Hash[String, T.untyped])
  permission = T.cast(response.fetch('permission'), String)
  check_permission!(permission)
  permission
end

def check_permission!(permission)

def check_permission!(permission)
  raise "Unexpected permission #{permission.inspect}!" if !Geet::Shared::RepoPermissions::ALL_PERMISSIONS.include?(permission)
end

def has_permission?(permission)

def has_permission?(permission)
  user_permission = self.class.repo_permission(@api_interface)
  permission_greater_or_equal_to?(user_permission, permission)
end

def initialize(username, api_interface)

def initialize(username, api_interface)
  @username = username
  @api_interface = api_interface
end

def is_collaborator?

def is_collaborator?
  api_path = "collaborators/#{@username}"
  begin
    @api_interface.send_request(api_path)
    # 204: user is a collaborator.
    true
  rescue Geet::Shared::HttpError => error
    # 404: not a collaborator.
    # Although the documentation mentions only 404, 403 is a valid response as well; it seems
    # that 404 is given on private repositories, while 403 on public ones ("Must have push
    # access to view repository collaborators.").
    #
    (error.code == 404 || error.code == 403) ? false : raise
  end
end