#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2017 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.

"""A command-line utility to access the Chrome OS master configuration.

Cros config is broken into two tools, cros_config and cros_config_host. This is
the latter; it is the build side version of cros_config. It is used by the build
system to access configuration details for for a Chrome OS device.
"""

from __future__ import print_function

import argparse
import json
import os
import sys

# pylint: disable=wrong-import-position
this_dir = os.path.dirname(__file__)
sys.path.insert(0, this_dir)
from libcros_config_host import CrosConfig
sys.path.pop(0)


def DumpConfig(config):
  """Dumps all of the config to stdout

  Args:
    config: A CrosConfig instance
  """
  result = config.GetFullConfig()
  output = json.dumps(result, sort_keys=True, indent=2)
  print(output)

def ListModels(config):
  """Prints all models in a config to stdout, one per line.

  Args:
    config: A CrosConfig instance
  """
  for model_name in config.GetModelList():
    print(model_name)

def GetProperty(device, path, prop):
  """Prints a property from the config tree for all models in the list models.

  Args:
    device: DeviceConfig instance for the lookup.
    path: The path (relative to a device) for the node containing the property.
    prop: The property to get (by name).
  """
  print(device.GetProperty(path, prop))

def GetFirmwareUris(config):
  """Prints space-separated firmware uris for all models in models.

  Args:
    config: A CrosConfig instance
  """
  print(' '.join(config.GetFirmwareUris()))

def GetTouchFirmwareFiles(config):
  """Print a list of touch firmware files across all models

  The output is one line for the firmware file and one line for the symlink,
  e.g.:
     ${FILESDIR}/wacom/4209.hex
     /opt/google/touch/firmware/wacom/4209.hex
     /lib/firmware/wacom_firmware_reef.bin

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetTouchFirmwareFiles():
    print(files.source)
    print(files.dest)
    print(files.symlink)

def GetDetachableBaseFirmwareFiles(config):
  """Prints a list of detachable base firmware files across all models.

  The output is one line for the firmware file and one line for the symlink,
  e.g.:
     ${FILESDIR}/detachable_base/firmware/masterball.fw
     /opt/google/detachable_base/firmware/masterball.fw
     /lib/firmware/masterball.fw

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetDetachableBaseFirmwareFiles():
    print(files.source)
    print(files.dest)
    print(files.symlink)

def GetArcFiles(config):
  """Print a list of arc++ files across all models

  The output is one line for the source file (typically relative to ${FILESDIR})
  and one line for the install file, e.g.:
     astronaut/arc++/board_hardware_features
     /usr/sbin/astronaut/board_hardware_features

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetArcFiles():
    print(files.source)
    print(files.dest)

def GetAudioFiles(config):
  """Print a list of audio files across all models

  The output is one line for the source file and one line for the install file,
  e.g.:
     ucm-config/bxtda7219max.reef.BASKING/bxtda7219max.reef.BASKING.conf
     /usr/share/alsa/ucm/bxtda7219max.basking/bxtda7219max.basking.conf

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetAudioFiles():
    print(files.source)
    print(files.dest)

def GetBluetoothFiles(config):
  """Print a list of bluetooth files across all devices

  The output is one line for the source file and one line for the install file,
  e.g.:
     bluetooth/main.conf
     /etc/bluetooth/main.conf

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetBluetoothFiles():
    print(files.source)
    print(files.dest)

def GetCameraFiles(config):
  """Print a list of camera files across all devices

  The output is one line for the source file and one line for the install file.
  e.g.:
    sw_build_config/platform/chromeos-config/camera/camera_config_${design}.json
    /etc/camera/camera_config_${design}.json

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetCameraFiles():
    print(files.source)
    print(files.dest)

def GetFirmwareBuildTargets(config, target_type):
  """Lists all firmware build-targets of the given type, for all models.

  Args:
    config: A CrosConfig instance to load data from.
    target_type: A string name for what target type to get build-targets for.
  """
  for target in config.GetFirmwareBuildTargets(target_type):
    print(target)


def GetMosysPlatform(config):
  """Get the name of the mosys platform for this board.

  cros_config_schema validates there is only one mosys platform per
  board.  This function finds and prints the first platform name.

  Args:
    config: A CrosConfig instance.

  Returns:
    An exit status (0 for success, 1 for failure).
  """
  devices = config.GetDeviceConfigs()
  for device in devices:
    identity = device.GetProperties('/identity')
    platform_name = identity.get('platform-name')
    if platform_name is not None:
      print(platform_name)
      return 0
  return 1


def GetFingerprintFirmwareROVersion(config, fpmcu):
  """Get the read-only versions of the fingerprint firmware for this board.

  cros_config_schema validates there is only one value for "ro-version" in the
  fingerprint object containing a "board" (fpmcu). This function finds and
  prints the value of the first "ro-version".

  Args:
    config: A CrosConfig instance.
    fpmcu: "FPMCU board".

  Returns:
    Exit code: 0 always since the ro-version does not have to be specified.
  """
  devices = config.GetDeviceConfigs()
  for device in devices:
    identity = device.GetProperties('/fingerprint')
    board = identity.get('board')
    if board == fpmcu:
      ro_version = identity.get('ro-version')
      if ro_version is not None:
        print(ro_version)
        return 0

  return 0


def GetThermalFiles(config):
  """Print a list of thermal files across all models

  The output is one line for the source file (typically relative to ${FILESDIR})
  and one line for the install file, e.g.:
     astronaut/dptf.dv
     /etc/dptf/astronaut/dptf.dv

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetThermalFiles():
    print(files.source)
    print(files.dest)

def GetIntelWifiSarFiles(config):
  """Print a list of intel wifi sar files across all models

  The output is one line for the source file
  and one line for the install file, e.g.:

     proj/sw_build_config/platform/chromeos-config/generated/wifi/wifi_sar_6.hex
     /firmware/cbfs-rw-raw/proj/wifi_sar_6.hex

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetIntelWifiSarFiles():
    print(files.source)
    print(files.dest)

def FileTree(config, root):
  """Print a tree showing all files installed for this config

  The output is a tree structure printed one directory/file per line. Each file
  is shown with its size, or missing it if is not present.

  Args:
    config: A CrosConfig instance
    root: Path to the root directory for the board (e.g. '/build/reef-uni')
  """
  tree = config.GetFileTree()
  config.ShowTree(tree, root)

def GetFirmwareBuildCombinations(config, targets):
  """Print the firmware build combinations for requested targets

  Args:
    config: A CrosConfig instance
    targets: List of names of the build targets to get combinations for
  """
  d = config.GetFirmwareBuildCombinations(targets)
  for name, target_values in d.items():
    print(name)
    for value in target_values:
      if value:
        print(value)
      else:
        print()


def GetWallpaperFiles(config):
  """Get the wallpaper files needed for installation

  Args:
    config: A CrosConfig instance

  Returns:
    List of wallpaper filenames (sorted)
  """
  for fname in config.GetWallpaperFiles():
    print(fname)

def GetAutobrightnessFiles(config):
  """Print a list of autobrightness files across all models

  The output is one line for the source file (typically relative to ${FILESDIR})
  and one line for the install file, e.g.:
     kohaku/autobrightness/model_params.json
     usr/share/chromeos-assets/autobrightness/kohaku/model_params.json

  Args:
    config: A CrosConfig instance
  """
  for files in config.GetAutobrightnessFiles():
    print(files.source)
    print(files.dest)


def GetParser(description):
  """Returns an ArgumentParser structured for the cros_config_host CLI.

  Args:
    description: A description of the entire script, and it's purpose in life.

  Returns:
    An ArgumentParser structured for the cros_config_host CLI.
  """
  parser = argparse.ArgumentParser(description)
  parser.add_argument('-c', '--config',
                      help='Override the master config file path. Use - for '
                           'stdin.')
  parser.add_argument('-m', '--model', type=str,
                      help='Which model to run the subcommand on. Defaults to '
                           'CROS_CONFIG_MODEL environment variable.')
  subparsers = parser.add_subparsers(dest='subcommand')
  subparsers.add_parser(
      'dump-config',
      help='Dumps all of the config via the respective API calls to stdout.')
  # Parser: list-models
  subparsers.add_parser(
      'list-models',
      help='Lists all models in the Cros Configuration Database.',
      epilog='Each model will be printed on its own line.')
  # Parser: get
  get_parser = subparsers.add_parser(
      'get',
      help='Gets a model property at the given path, with the given name.')
  get_parser.add_argument(
      'path',
      help="Relative path (within the model) to the property's parent node")
  get_parser.add_argument(
      'prop',
      help='The name of the property to get within the node at <path>.')
  # Parser: get-touch-firmware-files
  subparsers.add_parser(
      'get-touch-firmware-files',
      help='Lists groups of touch firmware files in sequence: first line is '
      'firmware file, second line is symlink name for /lib/firmware')
  # Parser: get-detachable-base-firmware-files
  subparsers.add_parser(
      'get-detachable-base-firmware-files',
      help='Lists groups of detachable base firmware files in sequence: '
      'first line is firmware file, second line is symlink name for '
      '/lib/firmware')
  subparsers.add_parser(
      'get-firmware-uris',
      help='Lists AP firmware URIs for models. These URIs can be used to '
           'fetch firmware files for the chromeos-firmware-xxx ebuilds.')
  # Parser: get-arc-files
  subparsers.add_parser(
      'get-arc-files',
      help='Lists pairs of arc++ files in sequence: first line is '
      'the relative source file, second line is the full install pathname')
  # Parser: get-audio-files
  subparsers.add_parser(
      'get-audio-files',
      help='Lists pairs of audio files in sequence: first line is '
      'the source file, second line is the full install pathname')
  # Parser: get-bluetooth-files
  subparsers.add_parser(
      'get-bluetooth-files',
      help='Lists pairs of bluetooth files in sequence: first line is '
      'the source file, second line is the full install pathname')
  # Parser: get-camera-files
  subparsers.add_parser(
      'get-camera-files',
      help='Lists pairs of camera files in sequence: first line is '
      'the source file, second line is the full install pathname')
  # Parser: get-firmware-build-targets
  build_target_parser = subparsers.add_parser(
      'get-firmware-build-targets',
      help='Lists firmware build-targets for the given type, for all models.',
      epilog='Each build-target will be printed on its own line.')
  build_target_parser.add_argument(
      'type',
      help='The build-targets type to get (ex. coreboot, ec, depthcharge)')
  # Parser: get-mosys-platform
  subparsers.add_parser(
      'get-mosys-platform',
      help='Get the name of the mosys platform compiled for this device.')
  # Parser: get-fpmcu-firmware-ro-version
  fpmcu_firmware_ro_parser = subparsers.add_parser(
      'get-fpmcu-firmware-ro-version',
      help='Get the fingerprint firmware RO version for this device.')
  fpmcu_firmware_ro_parser.add_argument('fpmcu', help='FPMCU "board"')
  # Parser: get-thermal-files
  subparsers.add_parser(
      'get-thermal-files',
      help='Lists pairs of thermal files in sequence: first line is '
      'the relative source file, second line is the full install pathname')
  # Parser: get-intel-wifi-sar-files
  subparsers.add_parser(
      'get-intel-wifi-sar-files',
      help='Lists pairs of intel wifi sar files in sequence: first line is '
      'the relative source file, second line is the full install pathname')
  # Parser: file-tree
  file_tree_parser = subparsers.add_parser(
      'file-tree',
      help='Shows all files installed by the BSP in a tree structure')
  file_tree_parser.add_argument(
      'root',
      help='Part to the root directory for this board')
  # Parser: write-target-dirs
  subparsers.add_parser(
      'write-target-dirs',
      help='Writes out a list of target directories for each PropFile element')
  # Parser: write-phandle-properties
  subparsers.add_parser(
      'write-phandle-properties',
      help='Writes out a list of properties which are used as phandles')
  # Parser: get-firmware-build-combinations
  build_combination_parser = subparsers.add_parser(
      'get-firmware-build-combinations',
      help='Lists firmware build combinations for the given types, for all '
      'models.')
  build_combination_parser.add_argument(
      'components',
      help='Comma-separated list of firmware components to get combinations '
      'for.')
  # Parser: get-wallpaper-files
  subparsers.add_parser(
      'get-wallpaper-files',
      help='Gets a list of wallpaper files which are used in the config')
  # Parser: get-autobrightness-files
  subparsers.add_parser(
      'get-autobrightness-files',
      help='Lists pairs of autobrightness files in sequence: first line is '
      'the relative source pathname, second line is the full install pathname')
  return parser


def main(argv=None):
  """Chrome OS Configuration for Host

  This Python script is used on the host (primary purpose is being called from
  the shell during building). It is broken into a sub-command tree that allows
  for traversal of models and access to their properties within.
  """
  parser = GetParser(__doc__)
  # Parse argv
  if argv is None:
    argv = sys.argv[1:]
  opts = parser.parse_args(argv)

  if not opts.model and 'CROS_CONFIG_MODEL' in os.environ:
    opts.model = os.environ['CROS_CONFIG_MODEL']

  config = CrosConfig(opts.config, model_filter_regex=opts.model)
  # Get all models we are invoking on (if any).
  if opts.model and not config.GetDeviceConfigs():
    print("Unknown model '%s'" % opts.model, file=sys.stderr)
    return
  # Main command branch
  if opts.subcommand == 'list-models':
    ListModels(config)
  elif opts.subcommand == 'dump-config':
    DumpConfig(config)
  elif opts.subcommand == 'get':
    if not opts.model:
      print('You must specify --model for this command. See --help for more '
            'info.', file=sys.stderr)
      return
    # There are multiple configs per model. Not sure how correct it is to pick
    # just the first one.
    model = config.GetDeviceConfigs()[0]
    GetProperty(model, opts.path, opts.prop)
  elif opts.subcommand == 'get-touch-firmware-files':
    GetTouchFirmwareFiles(config)
  elif opts.subcommand == 'get-detachable-base-firmware-files':
    GetDetachableBaseFirmwareFiles(config)
  elif opts.subcommand == 'get-firmware-uris':
    GetFirmwareUris(config)
  elif opts.subcommand == 'get-arc-files':
    GetArcFiles(config)
  elif opts.subcommand == 'get-audio-files':
    GetAudioFiles(config)
  elif opts.subcommand == 'get-bluetooth-files':
    GetBluetoothFiles(config)
  elif opts.subcommand == 'get-camera-files':
    GetCameraFiles(config)
  elif opts.subcommand == 'get-firmware-build-targets':
    GetFirmwareBuildTargets(config, opts.type)
  elif opts.subcommand == 'get-mosys-platform':
    return GetMosysPlatform(config)
  elif opts.subcommand == 'get-fpmcu-firmware-ro-version':
    return GetFingerprintFirmwareROVersion(config, opts.fpmcu)
  elif opts.subcommand == 'get-thermal-files':
    GetThermalFiles(config)
  elif opts.subcommand == 'get-intel-wifi-sar-files':
    GetIntelWifiSarFiles(config)
  elif opts.subcommand == 'file-tree':
    FileTree(config, opts.root)
  elif opts.subcommand == 'get-firmware-build-combinations':
    GetFirmwareBuildCombinations(config, opts.components.split(','))
  elif opts.subcommand == 'get-wallpaper-files':
    GetWallpaperFiles(config)
  elif opts.subcommand == 'get-autobrightness-files':
    GetAutobrightnessFiles(config)


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