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

import argparse
import logging
import sys

from devtoolslib.android_shell import AndroidShell
from devtoolslib.linux_shell import LinuxShell
from devtoolslib import shell_arguments
from devtoolslib import default_paths

USAGE = ("mojo_shell "
         "[--args-for=<mojo-app>] "
         "[--content-handlers=<handlers>] "
         "[--enable-external-applications] "
         "[--disable-cache] "
         "[--enable-multiprocess] "
         "[--url-mappings=from1=to1,from2=to2] "
         "[<mojo-app>] "
         """

A <mojo-app> is a Mojo URL or a Mojo URL and arguments within quotes.
Example: mojo_shell "mojo:js_standalone test.js".
<url-lib-path> is searched for shared libraries named by mojo URLs.
The value of <handlers> is a comma separated list like:
text/html,mojo:html_viewer,application/javascript,mojo:js_content_handler
""")

_DEFAULT_WINDOW_MANAGER = "mojo:kiosk_wm"


def main():
  logging.basicConfig()

  parser = argparse.ArgumentParser(usage=USAGE)

  # Arguments indicating the configuration we are targeting.
  parser.add_argument('--android', help='Run on Android',
                      action='store_true')
  debug_group = parser.add_mutually_exclusive_group()
  debug_group.add_argument('--debug', help='Debug build (default)',
                           default=True, action='store_true')
  debug_group.add_argument('--release', help='Release build', default=False,
                           dest='debug', action='store_false')
  parser.add_argument('--target-cpu', help='CPU architecture to run for.',
                      choices=['x64', 'x86', 'arm'])

  # Arguments configuring the shell run.
  parser.add_argument('--origin', help='Origin for mojo: URLs.')
  parser.add_argument('--window-manager', default=_DEFAULT_WINDOW_MANAGER,
                      help='Window manager app to be mapped as '
                      'mojo:window_manager. By default it is ' +
                      _DEFAULT_WINDOW_MANAGER)
  parser.add_argument('--no-debugger', action="store_true",
                      help='Do not spawn mojo:debugger.')
  parser.add_argument('--sky',
                      help='Loads the given Sky file.')
  parser.add_argument('-v', '--verbose', action="store_true",
                      help="Increase output verbosity")

  # Android-only arguments.
  parser.add_argument('--target-device',
                      help='(android-only) Device to run on.')
  parser.add_argument('--logcat-tags',
                      help='(android-only) Comma-separated list of additional '
                      'logcat tags to display on the console.')

  # Desktop-only arguments.
  parser.add_argument('--use-osmesa', action='store_true',
                      help='(linux-only) Configure the native viewport service '
                      'for off-screen rendering.')

  launcher_args, args = parser.parse_known_args()
  mojo_paths, _ = default_paths.infer_default_paths(launcher_args.android,
                                                    launcher_args.debug,
                                                    launcher_args.target_cpu)
  if mojo_paths:
    adb_path = mojo_paths['adb']
    shell_binary_path = mojo_paths['shell']
    local_origin_path = mojo_paths['build']
    if launcher_args.verbose:
      print 'Running within a Mojo checkout:'
      print ' - using the locally built shell at ' + shell_binary_path
      print ' - using the default origin of ' + local_origin_path
  else:
    if launcher_args.android:
      adb_path = 'adb'
      shell_binary_path = None
      local_origin_path = '.'
      if launcher_args.verbose:
        print 'Running outside a Mojo checkout:'
        print ' - using the shell already installed on the device'
        print ' - using the current working directory as default origin'
    else:
      print 'Running outside a Mojo checkout is not supported on Linux yet.'
      return 1

  if launcher_args.android:
    verbose_pipe = sys.stdout if launcher_args.verbose else None

    shell = AndroidShell(adb_path, launcher_args.target_device,
                         logcat_tags=launcher_args.logcat_tags,
                         verbose_pipe=verbose_pipe)
    device_status, error = shell.CheckDevice()
    if not device_status:
      print 'Device check failed: ' + error
      return 1
    if shell_binary_path:
      shell.InstallApk(shell_binary_path)

    args = shell_arguments.RewriteMapOriginParameters(shell, args)
    if not launcher_args.origin:
      args.extend(shell_arguments.ConfigureLocalOrigin(shell,
                                                       local_origin_path))
  else:
    shell = LinuxShell(shell_binary_path)
    if launcher_args.use_osmesa:
      args.append('--args-for=mojo:native_viewport_service --use-osmesa')

  if launcher_args.origin:
    args.append('--origin=' + launcher_args.origin)
  args = shell_arguments.AppendToArgument(args, '--url-mappings=',
                                          'mojo:window_manager=%s' %
                                          launcher_args.window_manager)
  if not launcher_args.no_debugger:
    args.extend(shell_arguments.ConfigureDebugger(shell))

  if launcher_args.sky:
    if not mojo_paths:
      print 'Running with --sky is not supported outside of the Mojo checkout.'
      # See https://github.com/domokit/devtools/issues/27.
      return 1
    args.extend(shell_arguments.ConfigureSky(shell, mojo_paths['root'],
                                             mojo_paths['sky_packages'],
                                             launcher_args.sky))

  if launcher_args.verbose:
    print "Shell arguments: " + str(args)

  shell.Run(args)
  return 0


if __name__ == "__main__":
  sys.exit(main())
