# encoding: utf-8

require_relative '../../api'

module Github
  class Client::Users::Followers < API

    # List a user's followers
    #
    # @example
    #  github = Github.new
    #  github.users.followers.list 'user-name'
    #  github.users.followers.list 'user-name' { |user| ... }
    #
    # List the authenticated user's followers
    #
    # @example
    #  github = Github.new oauth_token: '...'
    #  github.users.followers
    #  github.users.followers { |user| ... }
    #
    # @api public
    def list(*args)
      params = arguments(args).params

      response = if user_name = arguments.remaining.first
        get_request("/users/#{user_name}/followers", params)
      else
        get_request("/user/followers", params)
      end
      return response unless block_given?
      response.each { |el| yield el }
    end
    alias :all :list

    # List who a user is following
    #
    # @example
    #  github = Github.new
    #  github.users.followers.following 'user-name'
    #  github.users.followers.following 'user-name' { |user| ... }
    #
    # List who the authenicated user is following
    #
    # @example
    #  github = Github.new oauth_token: '...'
    #  github.users.followers.following
    #
    # @api public
    def following(*args)
      params = arguments(args).params

      response = if user_name = arguments.remaining.first
        get_request("/users/#{user_name}/following", params)
      else
        get_request("/user/following", params)
      end
      return response unless block_given?
      response.each { |el| yield el }
    end

    # Check if you are following a user
    #
    # @example
    #   github = Github.new oauth_token: '...'
    #   github.users.followers.following? 'user-name'
    #   github.users.followers.following? username: 'user-name'
    #
    # Check if one user follows another
    #
    # @example
    #   github = Github.new oauth_token: '...'
    #   github.users.followers.following? username: 'user-name',
    #     target_user: 'target-user-name'
    #
    # @api public
    def following?(*args)
      arguments(args, required: [:username])
      params = arguments.params
      if target_user = params.delete('target_user')
        get_request("/users/#{arguments.username}/following/#{target_user}", params)
      else
        get_request("/user/following/#{arguments.username}", params)
      end
      true
    rescue Github::Error::NotFound
      false
    end

    # Follow a user
    #
    # @example
    #  github = Github.new oauth_token: '...'
    #  github.users.followers.follow 'user-name'
    #  github.users.followers.follow username: 'user-name'
    #
    # @api public
    def follow(*args)
      arguments(args, required: [:username])
      put_request("/user/following/#{arguments.username}", arguments.params)
    end

    # Unfollow a user
    #
    # @example
    #  github = Github.new oauth_token: '...'
    #  github.users.followers.unfollow 'user-name'
    #  github.users.followers.unfollow username: 'user-name'
    #
    def unfollow(*args)
      arguments(args, required: [:username])
      delete_request("/user/following/#{arguments.username}", arguments.params)
    end
  end # Users::Followers
end # Github
