# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from recipe_engine import recipe_api


class ZbiApi(recipe_api.RecipeApi):
  """ZbiApi provides support for Zircon's ZBI tool."""

  def __init__(self, *args, **kwargs):
    super(ZbiApi, self).__init__(*args, **kwargs)
    # The path to the zbi command.
    self._zbi = None

  @property
  def zbi_path(self):
    """The path to the zbi tool."""
    return self._zbi

  @zbi_path.setter
  def zbi_path(self, path):
    """Sets the path to the zbi tool."""
    self._zbi = path

  def copy_and_extend(self, step_name, input_image, output_image, manifest):
    """
        Creates a copy of a ZBI and extends its bootFS manifest.

        A copy of |input_image| is made at |output_image|, and the files
        given in |manifest| are added to the latter's bootFS manifest.

        Args:
          step_name (str): The name of the step.
          input_image (Path): The path to the input image.
          output_image (Path): The path to the output image.
          manifest (dict[str]Path): a dictionary of destination-to-source
            mappings, where destination/source are paths to files or
            directories on target/host, respectively. Note that sources cannot
            be placeholders.

        Returns:
          A step to perform the operation.
        """
    assert self.zbi_path

    cmd = [
        self.zbi_path,
        '--output',
        self.m.raw_io.output(leak_to=output_image),
        input_image,
    ]

    for dest in manifest:
      cmd.extend(['--entry', '%s=%s' % (dest, manifest[dest])])

    return self.m.step(step_name, cmd)
