#!/usr/bin/env python
# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
"""Helper for building and deploying Observatory"""

import argparse
import os
import shutil
import subprocess
import sys

SCRIPT_DIR = os.path.dirname(sys.argv[0])
DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
RUN_PUB = os.path.join(DART_ROOT, 'tools/run_pub.py')
IGNORE_PATTERNS = shutil.ignore_patterns(
    '*.map',
    '*.concat.js',
    '*.scriptUrls',
    '*.precompiled.js',
    'main.*',
    'unittest*',
    '*_buildLogs*',
    '*.log',
    '*~')

usage = """obs_tool.py [options]"""

def BuildArguments():
  result = argparse.ArgumentParser(usage=usage)
  result.add_argument("--package-root", help="package root", default=None)
  result.add_argument("--dart-executable", help="dart executable", default=None)
  result.add_argument("--directory", help="observatory root", default=None)
  result.add_argument("--command", help="[get, build, deploy]", default=None)
  return result

def ProcessOptions(options, args):
  return ((options.package_root != None) and
          (options.directory != None) and
          (options.command != None) and
          (options.dart_executable != None))

def ChangeDirectory(directory):
  os.chdir(directory);

def PubGet(dart_executable, pkg_root):
  # Always remove pubspec.lock before running 'pub get'.
  try:
    os.remove('pubspec.lock');
  except OSError as e:
    pass
  return subprocess.call(['python',
                          RUN_PUB,
                          '--package-root=' + pkg_root,
                          '--dart-executable=' + dart_executable,
                          'get',
                          '--offline'])

def PubBuild(dart_executable, pkg_root, output_dir):
  return subprocess.call(['python',
                          RUN_PUB,
                          '--package-root=' + pkg_root,
                          '--dart-executable=' + dart_executable,
                          'build',
                          '--output',
                          output_dir])

def Deploy(input_dir, output_dir):
  shutil.rmtree(output_dir)
  shutil.copytree(input_dir, output_dir, ignore=IGNORE_PATTERNS)
  return 0

def ExecuteCommand(options, args):
  cmd = options.command
  if (cmd == 'get'):
    return PubGet(options.dart_executable, options.package_root)
  elif (cmd == 'build'):
    return PubBuild(options.dart_executable, options.package_root, args[0])
  elif (cmd == 'deploy'):
    Deploy('build', 'deployed')
  else:
    print >> sys.stderr, ('ERROR: command "%s" not supported') % (cmd)
    return -1;

def main():
  # Parse the options.
  parser = BuildArguments()
  (options, args) = parser.parse_known_args()
  if not ProcessOptions(options, args):
    parser.print_help()
    return 1
  if os.getenv('DART_USE_BOOTSTRAP_BIN') != None:
    dart_executable = options.dart_executable
  # Calculate absolute paths before changing directory.
  options.package_root = os.path.abspath(options.package_root)
  options.dart_executable = os.path.abspath(options.dart_executable)
  if len(args) == 1:
    args[0] = os.path.abspath(args[0])
  # Pub must be run from the project's root directory.
  ChangeDirectory(options.directory)
  return ExecuteCommand(options, args)

if __name__ == '__main__':
  sys.exit(main());