#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Checks for SDK updates."""


import sys

from google.appengine.tools import appengine_rpc
from google.appengine.tools import sdk_update_checker

SDK_PRODUCT = 'devappserver2_py'
# The server to use when checking for SDK updates.
_UPDATE_SERVER = 'appengine.google.com'


def _get_user_agent():
  """Returns the value of the 'User-Agent' header to use for update requests."""
  product_tokens = []
  version = sdk_update_checker.GetVersionObject()
  if version is None:
    release = 'unknown'
  else:
    release = version['release']

  product_tokens.append('%s/%s' % (SDK_PRODUCT, release))

  # Platform.
  product_tokens.append(appengine_rpc.GetPlatformToken())

  # Python version.
  python_version = '.'.join(str(i) for i in sys.version_info)
  product_tokens.append('Python/%s' % python_version)

  return ' '.join(product_tokens)


def _get_source_name():
  """Gets the name of this source version. Used for authentication."""
  version = sdk_update_checker.GetVersionObject()
  if version is None:
    release = 'unknown'
  else:
    release = version['release']
  return 'Google-appcfg-%s' % release


def check_for_updates(application_configuration):
  """Checks for updates to the SDK.

  A message will be printed on stdout if the SDK is not up-to-date.

  Args:
    application_configuration: The
        application_configuration.ApplicationConfiguration for the application.
        Used to check if the api_versions used by the modules are supported by
        the SDK.

  Raises:
    SystemExit: if the api_version used by a module is not supported by the
        SDK.
  """
  update_server = appengine_rpc.HttpRpcServer(
      _UPDATE_SERVER,
      lambda: ('unused_email', 'unused_password'),
      _get_user_agent(),
      _get_source_name())  # TODO: is the source name arg necessary?
  # Don't try to talk to ClientLogin.
  update_server.authenticated = True

  # TODO: Update check needs to be refactored so the api_version for
  # all runtimes can be checked without generating duplicate nag messages.
  if application_configuration.modules:
    update_check = sdk_update_checker.SDKUpdateChecker(
        update_server, application_configuration.modules)
    update_check.CheckSupportedVersion()  # Can raise SystemExit.
    if update_check.AllowedToCheckForUpdates():
      update_check.CheckForUpdates()
