#!/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"
_SKY_SERVER_PORT = 9998


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()
  paths, error_msg = default_paths.infer_default_paths(launcher_args.android,
                                                       launcher_args.debug,
                                                       launcher_args.target_cpu)
  if not paths:
    print error_msg
    return -1

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

    shell = AndroidShell(paths['adb'], 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
    shell.InstallApk(paths['shell'])

    args = shell_arguments.RewriteMapOriginParameters(shell, args)
    if not launcher_args.origin:
      args.extend(shell_arguments.ConfigureLocalOrigin(shell, paths['build']))
  else:
    shell = LinuxShell(paths['shell'])
    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:
    # Configure a server to serve the checkout root at / (so that Sky examples
    # are accessible using a root-relative path) and Sky packages at /packages.
    # This is independent from the server that potentially serves the origin
    # directory containing the mojo: apps.
    additional_mappings = [
        ('packages/', paths['sky_packages']),
    ]
    server_url = shell.ServeLocalDirectory(paths['root'],
        port=_SKY_SERVER_PORT, additional_mappings=additional_mappings)

    # Configure the content type mappings for the sky_viewer. This is needed
    # only for the Sky apps that do not declare mojo:sky_viewer in a shebang,
    # and it is unfortunate as it configures the shell to map all items of the
    # application/dart content-type as Sky apps.
    # TODO(ppi): drop this part once we can rely on the Sky files declaring
    # correct shebang.
    args = shell_arguments.AppendToArgument(args, '--content-handlers=',
                                            'text/sky,mojo:sky_viewer')
    args = shell_arguments.AppendToArgument(args, '--content-handlers=',
                                            'application/dart,mojo:sky_viewer')

    # Configure the window manager to embed the sky_viewer.
    sky_url = server_url + launcher_args.sky
    args.append('mojo:window_manager %s' % sky_url)

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

  shell.Run(args)
  return 0


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