#!/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 import shell_arguments
from devtoolslib import shell_config

_DESCRIPTION = """Runner for Mojo applications.

Any arguments not recognized by the script will be passed on as shell arguments.

Important shell arguments include:
  "--args-for=<mojo-app-url> <arguments>"
  "--content-handlers=<handlers>"
  "--disable-cache"
  "--enable-multiprocess"
  "--wait-for-debugger"
  "<mojo-app-url>"
  "<mojo-app-url> <arguments>"

The value of <handlers> is a comma separated list like:
text/html,mojo:html_viewer,application/javascript,mojo:js_content_handler
"""

# Port on which the mojo:debugger http server will be available on the host
# machine.
_MOJO_DEBUGGER_PORT = 7777
_DEFAULT_WM = 'mojo:kiosk_wm'

_WM_URL = 'mojo:window_manager'
_DEBUGGER_URL = 'https://core.mojoapps.io/debugger.mojo'


def _configure_debugger(shell):
  """Configures debugger.mojo to run and sets up port forwarding for its http
  server if the shell is running on a device.

  Returns:
    Arguments that need to be appended to the shell argument list in order to
    run with the debugger.
  """
  shell.forward_host_port_to_shell(_MOJO_DEBUGGER_PORT)
  return ['%s %d' % (_DEBUGGER_URL, _MOJO_DEBUGGER_PORT)]


def main():
  logging.basicConfig()

  parser = argparse.ArgumentParser(
      formatter_class=argparse.RawDescriptionHelpFormatter,
      description=_DESCRIPTION)
  shell_config.add_shell_arguments(parser)

  parser.add_argument('--embed', type=str,
                      help='Url to be embedded in the window manager.')
  parser.add_argument('--window-manager', default=_DEFAULT_WM,
                      help='Window manager app to be mapped as '
                      'mojo:window_manager. By default it is ' +
                      _DEFAULT_WM)
  parser.add_argument('--debugger', action="store_true",
                      help='Run debugger.mojo along with the app.')

  script_args, shell_args = parser.parse_known_args()

  try:
    config = shell_config.get_shell_config(script_args)
    shell, shell_args = shell_arguments.get_shell(config, shell_args)
  except shell_config.ShellConfigurationException as e:
    print e
    return 1

  shell_args = shell_arguments.append_to_argument(shell_args, '--url-mappings=',
                                                  '%s=%s' % (_WM_URL,
                                                  script_args.window_manager))

  if script_args.embed:
    shell_args.append('%s %s' % (script_args.window_manager, script_args.embed))

  if script_args.debugger:
    if script_args.verbose:
      print 'Spawning mojo:debugger, use `mojo_debug` to inspect the shell.'
      print 'Note that mojo:debugger will prevent the shell from terminating,'
      print '  pass --no-debugger to skip spawning mojo:debugger.'
    shell_args.extend(_configure_debugger(shell))

  if script_args.verbose:
    print "Shell arguments: " + str(shell_args)

  shell.run(shell_args)
  return 0


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