// Copyright (c) 2011 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.
//
// The signin manager encapsulates some functionality tracking
// which user is signed in. When a user is signed in, a ClientLogin
// request is run on their behalf. Auth tokens are fetched from Google
// and the results are stored in the TokenService.

#ifndef CHROME_BROWSER_SYNC_SIGNIN_MANAGER_H_
#define CHROME_BROWSER_SYNC_SIGNIN_MANAGER_H_
#pragma once

#include <string>
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/common/net/gaia/gaia_auth_consumer.h"
#include "chrome/common/net/gaia/google_service_auth_error.h"

class GaiaAuthFetcher;
class Profile;
class PrefService;

// Details for the Notification type GOOGLE_SIGNIN_SUCCESSFUL.
// A listener might use this to make note of a username / password
// pair for encryption keys.
struct GoogleServiceSigninSuccessDetails {
  GoogleServiceSigninSuccessDetails(const std::string& in_username,
                                    const std::string& in_password)
      : username(in_username),
        password(in_password) {}
  std::string username;
  std::string password;
};

class SigninManager : public GaiaAuthConsumer {
 public:
  SigninManager();
  virtual ~SigninManager();

  // Call to register our prefs.
  static void RegisterUserPrefs(PrefService* user_prefs);

  // If user was signed in, load tokens from DB if available.
  void Initialize(Profile* profile);

  // If a user is signed in, this will return their name.
  // Otherwise, it will return an empty string.
  const std::string& GetUsername();

  // Sets the user name.  Used for migrating credentials from previous system.
  void SetUsername(const std::string& username);

  // Attempt to sign in this user. If successful, set a preference indicating
  // the signed in user and send out a notification, then start fetching tokens
  // for the user.
  void StartSignIn(const std::string& username,
                   const std::string& password,
                   const std::string& login_token,
                   const std::string& login_captcha);

  // Used when a second factor access code was required to complete a signin
  // attempt.
  void ProvideSecondFactorAccessCode(const std::string& access_code);

  // Sign a user out, removing the preference, erasing all keys
  // associated with the user, and canceling all auth in progress.
  void SignOut();

  // GaiaAuthConsumer
  virtual void OnClientLoginSuccess(const ClientLoginResult& result);
  virtual void OnClientLoginFailure(const GoogleServiceAuthError& error);
  virtual void OnGetUserInfoSuccess(const std::string& key,
                                    const std::string& value);
  virtual void OnGetUserInfoKeyNotFound(const std::string& key);
  virtual void OnGetUserInfoFailure(const GoogleServiceAuthError& error);

 private:
  Profile* profile_;
  std::string username_;
  std::string password_;  // This is kept empty whenever possible.
  bool had_two_factor_error_;

  // Result of the last client login, kept pending the lookup of the
  // canonical email.
  ClientLoginResult last_result_;

  // Actual client login handler.
  scoped_ptr<GaiaAuthFetcher> client_login_;
};

#endif  // CHROME_BROWSER_SYNC_SIGNIN_MANAGER_H_