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

#include "build/branding_buildflags.h"
#include "build/build_config.h"
#include "google_apis/default_api_keys.h"

// This file contains a definition of `GetDefaultApiKeysFromDefinedValues()`
// which transforms a bunch of preprocessor defines into a struct that can be
// supplied to the `ApiKeyCache` constructor.
//
// This file is intended to be included several times, specifically for tests
// that manipulate preprocessor defines rather than the struct members.
//
// Please keep this file's list of dependencies minimal.

#if !defined(GOOGLE_API_KEY)
#define GOOGLE_API_KEY google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_METRICS_SIGNING_KEY)
#define GOOGLE_METRICS_SIGNING_KEY google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_CLIENT_ID_MAIN)
#define GOOGLE_CLIENT_ID_MAIN google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_CLIENT_SECRET_MAIN)
#define GOOGLE_CLIENT_SECRET_MAIN google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_CLIENT_ID_REMOTING)
#define GOOGLE_CLIENT_ID_REMOTING google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_CLIENT_SECRET_REMOTING)
#define GOOGLE_CLIENT_SECRET_REMOTING \
  google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_CLIENT_ID_REMOTING_HOST)
#define GOOGLE_CLIENT_ID_REMOTING_HOST \
  google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_CLIENT_SECRET_REMOTING_HOST)
#define GOOGLE_CLIENT_SECRET_REMOTING_HOST \
  google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if BUILDFLAG(IS_ANDROID)
#if !defined(GOOGLE_API_KEY_ANDROID_NON_STABLE)
#define GOOGLE_API_KEY_ANDROID_NON_STABLE \
  google_apis::DefaultApiKeys::kUnsetApiToken
#endif
#endif

#if !defined(GOOGLE_API_KEY_REMOTING)
#define GOOGLE_API_KEY_REMOTING google_apis::DefaultApiKeys::kUnsetApiToken
#endif

// API key for the Speech On-Device API (SODA).
#if !defined(GOOGLE_API_KEY_SODA)
#define GOOGLE_API_KEY_SODA google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !BUILDFLAG(IS_ANDROID)
// API key for the HaTS API.
#if !defined(GOOGLE_API_KEY_HATS)
#define GOOGLE_API_KEY_HATS google_apis::DefaultApiKeys::kUnsetApiToken
#endif
#endif

#if BUILDFLAG(IS_CHROMEOS)
// API key for the Nearby Sharing Service.
#if !defined(GOOGLE_API_KEY_SHARING)
#define GOOGLE_API_KEY_SHARING google_apis::DefaultApiKeys::kUnsetApiToken
#endif

// API key for the ReadAloud API.
#if !defined(GOOGLE_API_KEY_READ_ALOUD)
#define GOOGLE_API_KEY_READ_ALOUD google_apis::DefaultApiKeys::kUnsetApiToken
#endif

// API key for the Fresnel API.
#if !defined(GOOGLE_API_KEY_FRESNEL)
#define GOOGLE_API_KEY_FRESNEL google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#if !defined(GOOGLE_API_KEY_BOCA)
#define GOOGLE_API_KEY_BOCA google_apis::DefaultApiKeys::kUnsetApiToken
#endif

// API key for ChromeOS system services to resolve location.
#if !defined(GOOGLE_API_KEY_CROS_SYSTEM_GEO)
#define GOOGLE_API_KEY_CROS_SYSTEM_GEO \
  google_apis::DefaultApiKeys::kUnsetApiToken
#endif

// API key for ChromeOS Chrome to resolve location.
#if !defined(GOOGLE_API_KEY_CROS_CHROME_GEO)
#define GOOGLE_API_KEY_CROS_CHROME_GEO \
  google_apis::DefaultApiKeys::kUnsetApiToken
#endif

#endif  // BUILDFLAG(IS_CHROMEOS)

// These are used as shortcuts for developers and users providing
// OAuth credentials via preprocessor defines or environment
// variables.  If set, they will be used to replace any of the client
// IDs and secrets above that have not been set (and only those; they
// will not override already-set values).
#if !defined(GOOGLE_DEFAULT_CLIENT_ID)
#define GOOGLE_DEFAULT_CLIENT_ID ""
#endif
#if !defined(GOOGLE_DEFAULT_CLIENT_SECRET)
#define GOOGLE_DEFAULT_CLIENT_SECRET ""
#endif

constexpr ::google_apis::DefaultApiKeys GetDefaultApiKeysFromDefinedValues() {
  return {
      // TODO(crbug.com/40214105): Rewrite this condition using
      // BUILDFLAG(SUPPORT_EXTERNAL_GOOGLE_API_KEY).
      .allow_unset_values =
          !BUILDFLAG(GOOGLE_CHROME_BRANDING) || BUILDFLAG(IS_FUCHSIA),
      .allow_override_via_environment = !BUILDFLAG(GOOGLE_CHROME_BRANDING),
      .google_api_key = GOOGLE_API_KEY,
      .google_metrics_signing_key = GOOGLE_METRICS_SIGNING_KEY,
#if BUILDFLAG(IS_ANDROID)
      .google_api_key_android_non_stable = GOOGLE_API_KEY_ANDROID_NON_STABLE,
#else
      .google_api_key_hats = GOOGLE_API_KEY_HATS,
#endif  // BUILDFLAG(IS_ANDROID)
      .google_api_key_remoting = GOOGLE_API_KEY_REMOTING,
      .google_api_key_soda = GOOGLE_API_KEY_SODA,
#if BUILDFLAG(IS_CHROMEOS)
      .google_api_key_sharing = GOOGLE_API_KEY_SHARING,
      .google_api_key_read_aloud = GOOGLE_API_KEY_READ_ALOUD,
      .google_api_key_fresnel = GOOGLE_API_KEY_FRESNEL,
      .google_api_key_boca = GOOGLE_API_KEY_BOCA,
      .google_api_key_cros_system_geo_ = GOOGLE_API_KEY_CROS_SYSTEM_GEO,
      .google_api_key_cros_chrome_geo_ = GOOGLE_API_KEY_CROS_CHROME_GEO,
#endif
      .google_client_id_main = GOOGLE_CLIENT_ID_MAIN,
      .google_client_secret_main = GOOGLE_CLIENT_SECRET_MAIN,
      .google_client_id_remoting = GOOGLE_CLIENT_ID_REMOTING,
      .google_client_secret_remoting = GOOGLE_CLIENT_SECRET_REMOTING,
      .google_client_id_remoting_host = GOOGLE_CLIENT_ID_REMOTING_HOST,
      .google_client_secret_remoting_host = GOOGLE_CLIENT_SECRET_REMOTING_HOST,
      .google_default_client_id = GOOGLE_DEFAULT_CLIENT_ID,
      .google_default_client_secret = GOOGLE_DEFAULT_CLIENT_SECRET};
}
