#!/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.

"""Copy the sources for google-api-python-client into an App Engine project.

Copies the sources of the google-api-python-client
library into a Google App Engine project. This is necessary so that the
source can be uploaded when the application is deployed.

  $ enable-app-engine-project [flags] directory

"""

__author__ = 'jcgregorio@google.com (Joe Gregorio)'

import gflags
import logging
import sys
import os

from distutils.dir_util import copy_tree
from distutils.file_util import copy_file
from distutils.errors import DistutilsFileError

FLAGS = gflags.FLAGS
SOURCES = [
    'gflags',
    'gflags_validators',
    'httplib2',
    'oauth2client',
    'oauth2',
    'apiclient',
    'uritemplate',
    ]

gflags.DEFINE_enum('logging_level', 'ERROR',
    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
    'Set the level of logging detail.')

gflags.DEFINE_boolean('force', 'False',
    'Forcibly copy over client library files.')

gflags.DEFINE_boolean('dry_run', 'False', 'Don\'t actually do anything.')

def find_source(module):
  """Find the absolute path for the source of a module.

  Args:
    module: str, Name of the module.
  Returns:
    A tuple of (isdir, location), a boolean that's True if
    the source is a directory, False is it's a file,
    and the absolute path of the source.
  """
  isdir = False
  location = ''
  m = __import__(module)
  logging.debug('Absolute path for module %s: %s' % (module, m.__file__))
  basename = os.path.basename(m.__file__)
  if basename.startswith('__init__.'):
    isdir = True
    location = os.path.dirname(m.__file__)
  else:
    if os.path.isfile(m.__file__):
      location = m.__file__.rsplit('.', 1)[0] + '.py'
    else:
      # The file is an egg, extract to a temporary location
      import pkg_resources
      location = pkg_resources.resource_filename(module, module + '.py')

  return (isdir, location)

def main(argv):
  # Let the gflags module process the command-line arguments
  try:
    argv = FLAGS(argv)
  except gflags.FlagsError, e:
    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
    sys.exit(1)

  if len(argv) == 1:
    print 'Usage: %s ARGS\n%s' % (argv[0], FLAGS)
    sys.exit(1)

  # Set the logging according to the command-line flag
  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))

  logging.info('Setting up the directories: %s' % argv[1:])
  for dir in argv[1:]:
    # Check if the supplied directory is an App Engine project by looking
    # for an app.yaml
    if not os.path.isfile(os.path.join(dir, 'app.yaml')):
      sys.exit('The given directory is not a Google App Engine project: %s' % dir)


    # Build up the set of file or directory copying actions we need to do
    action = [] # (src, dst, isdir)
    for source in SOURCES:
      isdir, source_location = find_source(source)
      if isdir:
        target = source
      else:
        target = source + ".py"
      full_target = os.path.join(dir, target)
      if not FLAGS.force and os.path.exists(full_target):
        noun = isdir and 'Directory' or 'File'
        sys.exit("%s already exists in project: %s" % (noun, target))
      action.append((source_location, full_target, isdir))

    # Now perform all the copying actions we collected
    try:
      for src, dst, isdir in action:
        if isdir:
          results = copy_tree(src, dst, FLAGS.dry_run)
          for filename in results:
            print 'Copied: %s' % filename
        else:
          filename, copied = copy_file(src, dst, FLAGS.dry_run)
          print 'Copied: %s Successfully: %s' % (filename, copied)
    except DistutilsFileError, e:
      sys.exit(str(e))

if __name__ == '__main__':
  main(sys.argv)
