// Copyright (c) 2012 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 GOOGLE_APIS_GAIA_GAIA_URLS_H_
#define GOOGLE_APIS_GAIA_GAIA_URLS_H_

#include <string>

#include "base/memory/singleton.h"
#include "url/gurl.h"

// A signleton that provides all the URLs that are used for connecting to GAIA.
class GaiaUrls {
 public:
  static GaiaUrls* GetInstance();

  // The URLs for different calls in the Google Accounts programmatic login API.
  const GURL& gaia_url() const;
  const GURL& captcha_base_url() const;
  const GURL& client_login_url() const;
  const GURL& service_login_url() const;
  const GURL& service_login_auth_url() const;
  const GURL& service_logout_url() const;
  const GURL& issue_auth_token_url() const;
  const GURL& get_user_info_url() const;
  const GURL& token_auth_url() const;
  const GURL& merge_session_url() const;
  const GURL& get_oauth_token_url() const;
  const GURL& oauth_get_access_token_url() const;
  const GURL& oauth_wrap_bridge_url() const;
  const GURL& oauth_user_info_url() const;
  const GURL& oauth_revoke_token_url() const;
  const GURL& oauth1_login_url() const;
  const GURL& embedded_signin_url() const;
  const GURL& add_account_url() const;

  const std::string& oauth2_chrome_client_id() const;
  const std::string& oauth2_chrome_client_secret() const;
  const GURL& client_login_to_oauth2_url() const;
  const GURL& oauth2_auth_url() const;
  const GURL& oauth2_token_url() const;
  const GURL& oauth2_issue_token_url() const;
  const GURL& oauth2_token_info_url() const;
  const GURL& oauth2_revoke_url() const;

  const GURL& gaia_login_form_realm() const;

  GURL ListAccountsURLWithSource(const std::string& source);
  GURL GetCheckConnectionInfoURLWithSource(const std::string& source);

 private:
  GaiaUrls();
  ~GaiaUrls();

  friend struct DefaultSingletonTraits<GaiaUrls>;

  GURL gaia_url_;
  GURL captcha_base_url_;

  GURL lso_origin_url_;
  GURL google_apis_origin_url_;

  GURL client_login_url_;
  GURL service_login_url_;
  GURL service_login_auth_url_;
  GURL service_logout_url_;
  GURL issue_auth_token_url_;
  GURL get_user_info_url_;
  GURL token_auth_url_;
  GURL merge_session_url_;
  GURL get_oauth_token_url_;
  GURL oauth_get_access_token_url_;
  GURL oauth_wrap_bridge_url_;
  GURL oauth_user_info_url_;
  GURL oauth_revoke_token_url_;
  GURL oauth1_login_url_;
  GURL list_accounts_url_;
  GURL embedded_signin_url_;
  GURL add_account_url_;
  GURL get_check_connection_info_url_;

  std::string oauth2_chrome_client_id_;
  std::string oauth2_chrome_client_secret_;

  GURL client_login_to_oauth2_url_;
  GURL oauth2_auth_url_;
  GURL oauth2_token_url_;
  GURL oauth2_issue_token_url_;
  GURL oauth2_token_info_url_;
  GURL oauth2_revoke_url_;

  GURL gaia_login_form_realm_;

  DISALLOW_COPY_AND_ASSIGN(GaiaUrls);
};

#endif  // GOOGLE_APIS_GAIA_GAIA_URLS_H_
