#!/usr/bin/env python3.4
#
# Copyright 2016 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tool to interactively call methods of code snippets.

Mobly Code Snippet Lib (https://github.com/google/mobly-snippet-lib/) is a
library for triggering custom actions on Android devices by means of an RPC
service.

Usage:
$ snippet_shell com.my.package.snippets
>>> s.mySnippet('example')
u'You said: example'
"""
from __future__ import print_function

import argparse
import logging
import sys

from mobly.controllers import android_device
from mobly.controllers.android_device_lib import jsonrpc_shell_base


class SnippetShell(jsonrpc_shell_base.JsonRpcShellBase):
  def __init__(self, package):
    self._package = package

  def _start_services(self, console_env):
    """Overrides superclass."""
    self._ad.load_snippet(name='snippet', package=self._package)
    console_env['snippet'] = self._ad.snippet
    console_env['s'] = self._ad.snippet

  def _get_banner(self, serial):
    lines = [
      'Connected to %s.' % serial, 'Call methods against:',
      '    ad (android_device.AndroidDevice)',
      '    snippet or s (Snippet)'
    ]
    return '\n'.join(lines)


if __name__ == '__main__':
  parser = argparse.ArgumentParser(
    description='Interactive client for Mobly code snippets.')
  parser.add_argument(
    '-s',
    '--serial',
    help=
    'Device serial to connect to (if more than one device is connected)')
  parser.add_argument(
    'package',
    metavar='PACKAGE_NAME',
    type=str,
    nargs='?',
    help='The package name of the snippet to use.')
  parser.add_argument(
    '--mbs',
    help='Whether to connect to Mobly Bundled Snippets',
    action='store_true')
  args = parser.parse_args()
  if args.package and args.mbs:
    print('Cannot specify both --package and --mbs', file=sys.stderr)
    sys.exit(1)
  if args.mbs:
    package = android_device.MBS_PACKAGE
  else:
    package = args.package

  logging.basicConfig(level=logging.INFO)
  SnippetShell(package).main(args.serial)
