#!/usr/bin/env python
# Copyright 2019 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.

"""Tool to (re)prepare a DUT for lab deployment.

TODO(this docstring is a stub).
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import logging

import common
from autotest_lib.site_utils.deployment.prepare import dut as preparedut

def main():
  """Tool to (re)prepare a DUT for lab deployment.

  TODO(this docstring is a stub).
  """
  opts = _parse_args()
  # Setup tempfile to capture trash dropped by autotest?
  # Setup logging to avoid dumping everything to stdout?
  logging.basicConfig(level=logging.DEBUG)

  with preparedut.create_host(
      opts.hostname, opts.board, opts.model, opts.servo_hostname,
      opts.servo_port, opts.servo_serial, opts.uart_logs_dir) as host:

    if 'stage-usb' in opts.actions:
      preparedut.download_image_to_servo_usb(host, opts.build)
    if 'install-firmware' in opts.actions:
      preparedut.install_firmware(host, opts.force_firmware)
    if 'install-test-image' in opts.actions:
      preparedut.install_test_image(host)


def _parse_args():
  parser = argparse.ArgumentParser(
      description='Prepare / validate DUT for lab deployment.')

  parser.add_argument(
      'actions',
      nargs='+',
      choices=['stage-usb', 'install-firmware', 'install-test-image'],
      help='DUT preparation actions to execute.',
  )
  parser.add_argument(
      '--hostname',
      required=True,
      help='Hostname of the DUT to prepare.',
  )

  parser.add_argument(
      '--board',
      required=True,
      help='Board label of the DUT to prepare.',
  )
  parser.add_argument(
      '--model',
      required=True,
      help='Model label of the DUT to prepare.',
  )
  parser.add_argument(
      '--build',
      required=True,
      help='Chrome OS image version to use for installation.',
  )

  parser.add_argument(
      '--servo-hostname',
      required=True,
      help='Hostname of the servo host connected to the DUT.',
  )
  parser.add_argument(
      '--servo-port',
      required=True,
      help='Servo host port (to be) used for the controlling servo.',
  )
  parser.add_argument(
      '--servo-serial',
      help='Serial number of the controlling servo.',
  )
  parser.add_argument(
      '--force-firmware',
      action='store_true',
      help='Force firmware isntallation via chromeos-installfirmware.',
  )
  parser.add_argument(
      '--uart-logs-dir',
      help='The directory to save UART logs.'
  )

  return parser.parse_args()


if __name__ == '__main__':
  main()
