// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef REMOTING_TEST_ACCESS_TOKEN_FETCHER_H_
#define REMOTING_TEST_ACCESS_TOKEN_FETCHER_H_

#include <memory>
#include <string>

#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "google_apis/gaia/gaia_oauth_client.h"

namespace network {
class SharedURLLoaderFactory;
class TransitionalURLLoaderFactoryOwner;
}  // namespace network

namespace remoting {
namespace test {

// Supplied by the client for each request to GAIA and returns valid tokens on
// success or empty tokens on failure.
typedef base::Callback<void(const std::string& access_token,
                            const std::string& refresh_token)>
    AccessTokenCallback;

// Retrieves an access token from either an authorization code or a refresh
// token.  Destroying the AccessTokenFetcher while a request is outstanding will
// cancel the request. It is safe to delete the fetcher from within a completion
// callback.  Must be used from a thread running an IO message loop.
// The public methods are virtual to allow for mocking and fakes.
class AccessTokenFetcher : public gaia::GaiaOAuthClient::Delegate {
 public:
  AccessTokenFetcher();
  ~AccessTokenFetcher() override;

  // Retrieve an access token from a one time use authorization code.
  virtual void GetAccessTokenFromAuthCode(const std::string& auth_code,
                                          const AccessTokenCallback& callback);

  // Retrieve an access token from a refresh token.
  virtual void GetAccessTokenFromRefreshToken(
      const std::string& refresh_token,
      const AccessTokenCallback& callback);

  void SetURLLoaderFactoryForTesting(
      scoped_refptr<network::SharedURLLoaderFactory>
          url_loader_factory_for_testing);

 private:
  // gaia::GaiaOAuthClient::Delegate Interface.
  void OnGetTokensResponse(const std::string& refresh_token,
                           const std::string& access_token,
                           int expires_in_seconds) override;
  void OnRefreshTokenResponse(const std::string& access_token,
                              int expires_in_seconds) override;
  void OnGetUserEmailResponse(const std::string& user_email) override;
  void OnGetUserIdResponse(const std::string& user_id) override;
  void OnGetUserInfoResponse(
      std::unique_ptr<base::DictionaryValue> user_info) override;
  void OnGetTokenInfoResponse(
      std::unique_ptr<base::DictionaryValue> token_info) override;
  void OnOAuthError() override;
  void OnNetworkError(int response_code) override;

  // Updates |auth_client_| with a new GaiaOAuthClient instance.
  void CreateNewGaiaOAuthClientInstance();

  // Validates the retrieved access token.
  void ValidateAccessToken();

  // Caller-supplied callback used to return valid tokens on success or empty
  // tokens on failure.
  AccessTokenCallback access_token_callback_;

  // Retrieved based on the |refresh_token_|.
  std::string access_token_;

  // Supplied by the caller or retrieved from a caller-supplied auth token.
  std::string refresh_token_;

  // Holds the client id, secret, and redirect url used to make
  // the Gaia service request.
  gaia::OAuthClientInfo oauth_client_info_;

  // Used to feed network into |auth_client_|.
  std::unique_ptr<network::TransitionalURLLoaderFactoryOwner>
      url_loader_factory_owner_;

  scoped_refptr<network::SharedURLLoaderFactory>
      url_loader_factory_for_testing_;

  // Used to make token requests to GAIA.
  std::unique_ptr<gaia::GaiaOAuthClient> auth_client_;

  DISALLOW_COPY_AND_ASSIGN(AccessTokenFetcher);
};

}  // namespace test
}  // namespace remoting

#endif  // REMOTING_TEST_ACCESS_TOKEN_FETCHER_H_
