#!/usr/bin/env python
# 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.

"""Python API for retrieving API keys.

Note that this does not have the exact same semantics as the C++ API
in google_api_keys.h, since it does not have access to gyp variables
or preprocessor defines.
"""

import os
import re
import sys


# The token returned when an API key is unset.
DUMMY_TOKEN = 'dummytoken'


def _GetTokenFromOfficialFile(token_name):
  """Parses the token from the official file if it exists, else returns None."""
  official_path = os.path.join(os.path.dirname(__file__),
                               'internal/google_chrome_api_keys.h')
  if not os.path.isfile(official_path):
    return None

  line_regexp = '^#define\s*%s\s*"([^"]+)"' % token_name
  line_pattern = re.compile(line_regexp)
  def ParseLine(current_line):
    result = line_pattern.match(current_line)
    if result:
      return result.group(1)
    else:
      return None

  with open(official_path) as f:
    current_line = ''
    for line in f:
      if line.endswith('\\\n'):
        current_line += line[:-2]
      else:
        # Last line in multi-line #define, or a line that is not a
        # continuation line.
        current_line += line
        token = ParseLine(current_line)
        if token:
          if current_line.count('"') != 2:
            raise Exception(
              'Embedded quotes and multi-line strings are not supported.')
          return token
        current_line = ''
    return None


def _GetToken(token_name):
  """Returns the API token with the given name, or DUMMY_TOKEN by default."""
  if token_name in os.environ:
    return os.environ[token_name]
  token = _GetTokenFromOfficialFile(token_name)
  if token:
    return token
  else:
    return DUMMY_TOKEN


def GetAPIKey():
  """Returns the simple API key."""
  return _GetToken('GOOGLE_API_KEY')


def GetAPIKeyPhysicalWebTest():
  """Returns the API key to test Physical Web service."""
  return _GetToken('GOOGLE_API_KEY_PHYSICAL_WEB_TEST')


def GetClientID(client_name):
  """Returns the OAuth 2.0 client ID for the client of the given name."""
  return _GetToken('GOOGLE_CLIENT_ID_%s' % client_name)


def GetClientSecret(client_name):
  """Returns the OAuth 2.0 client secret for the client of the given name."""
  return _GetToken('GOOGLE_CLIENT_SECRET_%s' % client_name)


if __name__ == "__main__":
  print 'GOOGLE_API_KEY=%s' % GetAPIKey()
  print 'GOOGLE_CLIENT_ID_MAIN=%s' % GetClientID('MAIN')
  print 'GOOGLE_CLIENT_SECRET_MAIN=%s' % GetClientSecret('MAIN')
  print 'GOOGLE_CLIENT_ID_CLOUD_PRINT=%s' % GetClientID('CLOUD_PRINT')
  print 'GOOGLE_CLIENT_SECRET_CLOUD_PRINT=%s' % GetClientSecret('CLOUD_PRINT')
  print 'GOOGLE_CLIENT_ID_REMOTING=%s' % GetClientID('REMOTING')
  print 'GOOGLE_CLIENT_SECRET_REMOTING=%s' % GetClientSecret('REMOTING')
  print 'GOOGLE_CLIENT_ID_REMOTING_HOST=%s' % GetClientID('REMOTING_HOST')
  print 'GOOGLE_CLIENT_SECRET_REMOTING_HOST=%s' % GetClientSecret(
      'REMOTING_HOST')
  print 'GOOGLE_CLIENT_ID_REMOTING_IDENTITY_API=%s' %GetClientID(
      'REMOTING_IDENTITY_API')
