#!/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
from devtoolslib.utils import disable_output_buffering

_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
_LAUNCHER = 'mojo:launcher'

_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():
  disable_output_buffering()
  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('--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

  if script_args.embed:
    shell_args.append('%s %s' % (_LAUNCHER, 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())
