#!/usr/bin/python
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Command line options to support cros_gestures.py.

This code assembles and parses options used by commands run
by cros_gestures.
"""

import getpass
import optparse
import os
import sys

import cros_gestures_commands
import cros_gestures_utils


color = cros_gestures_utils.Color()


# Find the hardware_Trackpad config file - we share it with the test.
base_dir = os.path.dirname(os.path.dirname(__file__))
trackpad_test_dir = os.path.join('/usr/local/autotest/tests/hardware_Trackpad')
if os.path.isdir(trackpad_test_dir):
  os.environ['TRACKPAD_TEST_DIR'] = trackpad_test_dir
else:
  trackpad_test_dir = os.environ.get('TRACKPAD_TEST_DIR')
  if not trackpad_test_dir or not os.path.isdir(trackpad_test_dir):
    cros_gestures_utils.OutputAndExit(
        'Unable to determine where the hardware_Trackpad test resides.'
        '\nPlease check the TRACKPAD_TEST_DIR environment variable.')

sys.path.insert(0, trackpad_test_dir)
from trackpad_util import read_trackpad_test_conf
from trackpad_util import trackpad_test_conf


def GetConfigOptions(current_dir):
  """Helper to retrieve config details like area and functionality."""
  found = False
  for path in [current_dir, os.environ.get('TRACKPAD_TEST_DIR')]:
    trackpad_test_conf_path = os.path.join(path, trackpad_test_conf)
    if os.path.isfile(trackpad_test_conf_path):
      found = True
      break
  if not found:
    msg = 'Unable to find config file: %s.' % trackpad_test_conf
    cros_gestures_utils.OutputAndExit(msg, red=True)

  config_options = {}
  for f in read_trackpad_test_conf('functionality_list', path):
    if f.name in config_options.iteritems():
      msg = ('Found a repeated functionality. Please check the conf file '
             'in %s' % path)
      cros_gestures_utils.OutputAndExit(msg, red=True)
    config_options[f.name] = f.area

  return config_options


def ParseArgs(usage, commands, admin=False):
  """Common processing of command line options."""
  base_dir = os.path.dirname(os.path.abspath(sys.argv[0]))

  parser = optparse.OptionParser(usage=usage)
  parser.add_option('-d', '--debug',
                    help='Show more output [default: %default]',
                    dest='debugout',
                    action='store_true',
                    default=False)
  parser.add_option('-D', '--detailed-debug',
                    help='Show even more output [default: %default]',
                    dest='detaileddebugout',
                    action='store_true',
                    default=False)
  parser.add_option('-m', '--model',
                    help='Gesture file model [default: %default]',
                    dest='model',
                    default=None)
  parser.add_option('-u', '--user',
                    help='Gesture file owner [default: %default]',
                    dest='userowner',
                    default=getpass.getuser())
  config_options = GetConfigOptions(base_dir)
  cros_gestures_commands.AddOptions(parser, config_options, admin=admin)
  options, args = parser.parse_args()
  options.config_options = config_options

  COMMANDS_STRING = ', '.join(sorted(commands.keys()))
  if len(args) < 1 or args[0].lower() not in commands:
    msg = 'Must supply 1 command from: %s.' % COMMANDS_STRING
    cros_gestures_utils.OutputAndExit(msg, red=True)
  command = args[0].lower()

  return options, args[1:], command
