# -*- coding: utf-8 -*-
# Copyright 2020 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.

"""flash-ap command."""

from __future__ import print_function

import os
import sys

from chromite.cli import command
from chromite.lib import build_target_lib
from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import cros_logging as logging
from chromite.lib.firmware import ap_firmware


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


@command.CommandDecorator('flash-ap')
class FlashApCommand(command.CliCommand):
  """Update the AP Firmware on a device."""

  EPILOG = """Command to flash the AP firmware onto a DUT.

To flash your zork DUT with an IP of 1.1.1.1 via SSH:
  cros flash-ap -b zork -i /path/to/image.bin -d ssh://1.1.1.1

To flash your volteer DUT via SERVO on the default port (9999):
  cros flash-ap -d servo:port -b volteer -i /path/to/image.bin

To flash your volteer DUT via SERVO on port 1234:
  cros flash-ap -d servo:port:1234 -b volteer -i /path/to/image.bin
"""

  @classmethod
  def AddParser(cls, parser):
    super(FlashApCommand, cls).AddParser(parser)
    cls.AddDeviceArgument(
        parser,
        schemes=[
            commandline.DEVICE_SCHEME_SSH, commandline.DEVICE_SCHEME_SERVO
        ])

    parser.add_argument(
        '-i',
        '--image',
        required=True,
        type='path',
        help='/path/to/BIOS_image.bin')
    parser.add_argument(
        '-b',
        '--build-target',
        default=cros_build_lib.GetDefaultBoard(),
        dest='build_target',
        help='The name of the build target.')
    parser.add_argument(
        '--flashrom',
        action='store_true',
        help='Use flashrom to flash instead of futility.')
    parser.add_argument(
        '--fast',
        action='store_true',
        help='Speed up flashing by not validating flash.')
    parser.add_argument(
        '-n', '--dry-run',
        action='store_true',
        help='Execute a dry-run. Print the commands that would be run instead '
             'of running them.')

  def validate_options(self):
    """Parse the arguments."""
    if not os.path.exists(self.options.image):
      logging.error('%s does not exist, verify the path of your build and try '
                    'again.', self.options.image)

    self.options.Freeze()

  def Run(self):
    """Perform the cros flash-ap command."""
    commandline.RunInsideChroot(self)
    self.validate_options()

    build_target = build_target_lib.BuildTarget(self.options.build_target)
    try:
      ap_firmware.deploy(
          build_target,
          self.options.image,
          self.options.device,
          flashrom=self.options.flashrom,
          fast=self.options.fast,
          verbose=self.options.verbose,
          dryrun=self.options.dry_run)
    except ap_firmware.Error as e:
      cros_build_lib.Die(e)
