# Copyright 2021 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 BundleFetcherApi(recipe_api.RecipeApi):
    """APIs for interacting with the bundle_fetcher tool."""

    def __call__(self, *args, **kwargs):
        name = kwargs.pop("name", "bundle_fetcher")
        return self.m.step(
            name, [self._bundle_fetcher_path] + list(args or []), **kwargs
        )

    @property
    def _bundle_fetcher_path(self):
        # Built as "tools/bundle_fetcher:host" via the host_prebuilts-x64-foo
        # builders.
        return self.m.ensure_tool("bundle_fetcher", self.resource("tool_manifest.json"))

    def download(self, build_ids, gcs_bucket, out_dir):
        """Downloads and updates product manifests to contain the absolute URIs
        and stores them in the out directory.

        Args:
          build_ids (list(int)): List of build ids to retrieve product manifests for.
          gcs_bucket (str): Bucket from which to read the files from.
          out_dir (Path): Out directory to write the product bundles manifest to.
        """
        return self(
            "download",
            "-build_ids",
            ",".join(str(b) for b in build_ids),
            "-bucket",
            gcs_bucket,
            "-out_dir",
            out_dir,
        )
