#!/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 = 'https://core.mojoapps.io/kiosk_wm.mojo'

_LEGACY_WM_URL = 'mojo:window_manager'
_WM_URL = 'https://core.mojoapps.io/window_manager.mojo'
_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' % (_LEGACY_WM_URL,
                                                  script_args.window_manager))
  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())
