#!/bin/bash
# Copyright 2023 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.

#### CATEGORY=Internal API
### Builds and returns a list of a desired set of build artifacts

## usage: fx get-flash-source [--build] [--allow-empty | --expect-one]
##
## Builds and returns the source file for `fx flash` with an appropriate
## prefix. This returns 'flash-manifest:<path>' or 'product-bundle:<path>'
## depending on the type of source relevant for the current build
## configuration.
##
##  --build       build the artifacts as well as returning a list of them
##
set -o errexit

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh
fx-config-read

readonly ARGS_JSON="args.json"
readonly IMAGES_JSON="images.json"
readonly PRODUCT_BUNDLES_JSON="product_bundles.json"

build=false
while [[ $# -ne 0 ]]; do
  case "$1" in
  --help|-h)
      fx-command-help
      exit 0
      ;;
  --build)
    build=true
    ;;
  -*)
    fx-error "Unknown flag: $1"
    fx-command-help
    exit 1
    ;;
  *)
    if [[ -z "${mode}" ]]; then
      mode="$1"
    else
      fx-error "unexpected argument: '$1'"
      exit 1
    fi
    ;;
  esac
  shift
done

function _query_manifest {
  local manifest="$1"
  local jq_filter="$2"
  local paths=($(fx-command-run jq --raw-output "${jq_filter}" "${FUCHSIA_BUILD_DIR}/${manifest}"))
  # At most one path is supported.
  if [[ ${#paths[@]} -gt 1 ]]; then
    fx-error "More than one path found!"
    exit 1
  fi
  printf %s "${paths[0]}"
}

function _build_gn_label {
  local target="${1#//}"
  # Cut the toolchain suffix which begins with '(' if any.
  # E.g. //src/foo(//build/toolchain/fuchsia:x64) --> //src/foo
  target="$(printf %s "${target}" | cut -d'(' -f1)"
  # Important: redirect stdout to stderr to avoid polluting this script's
  # output. See https://fxbug.dev/42076242
  >&2 fx-command-run build "${target}"
}

use_bazel_images_only="$(_query_manifest "${ARGS_JSON}" .use_bazel_images_only)"
if [[ "${use_bazel_images_only}" == "true" ]]; then
    product="$(_query_manifest "${ARGS_JSON}" .build_info_product)"
    board="$(_query_manifest "${ARGS_JSON}" .build_info_board)"
    product_bundle_name="${product}.${board}"
    product_bundle="$(_query_manifest "${PRODUCT_BUNDLES_JSON}" '.[] | select(.name == "'${product_bundle_name}'") | .path')"
    if [[ -z "${product_bundle}" ]]; then
      fx-error "Failed to find a product bundle"
      exit 1
    fi
    if $build ; then
      product_bundle_label="$(_query_manifest "${PRODUCT_BUNDLES_JSON}" '.[] | select(.name == "'${product_bundle_name}'")| .label')"
      _build_gn_label "${product_bundle_label}"
    fi
    echo "product-bundle:${product_bundle}"
else
    flash_manifest="$(_query_manifest "${IMAGES_JSON}" '.[] | select(.name == "flash-manifest") | .path')"
    if [[ -z "${flash_manifest}" ]]; then
      fx-error "Failed to find a flash manifest"
      exit 1
    fi
    if $build ; then
      flash_manifest_label="$(_query_manifest "${IMAGES_JSON}" '.[] | select(.name == "flash-manifest") | .label')"
      _build_gn_label "${flash_manifest_label}"
    fi
    echo "flash-manifest:${flash_manifest}"
fi
