#!/bin/bash
# Copyright 2025 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=Build
### Manage build ResultStore configuration.  ResultStore is a service
### for publishing and sharing build and test results (not artifacts).
### Fuchsia's results can be found at go/fxbtx (ResultStore UI).

## usage:
##  fx resultstore status
##       Show if ResultStore uploading during fx build is enabled or disabled.
##
##  fx resultstore enable
##       Enable ResultStore uploading during fx build.
##
##  fx resultstore disable
##       Disable ResultStore uploading during fx build.
##
## ResultStore data will contain information about the users's environment,
## including $USER name, and working directory.
## ResultStore data however, is only visible internally to Googlers.

set -e

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
source "${FUCHSIA_DIR}/tools/devshell/lib/style.sh" || exit $?

readonly RESULTSTORE_CONFIG="${FUCHSIA_DIR}/.fx/config/resultstore"
readonly rsproxy_wrap="${FUCHSIA_DIR}/prebuilt/rsclient/${HOST_PLATFORM}/bin/rsproxy-wrap.sh"

function usage {
  fx-command-help
}

function styled-status {
  local enabled="$1"
  local resultstore_status
  if [[ "$RESULTSTORE_ENABLED" -eq 1 ]]; then
    resultstore_status="enabled"
    color="green"
  else
    resultstore_status="disabled"
    color="red"
  fi
  style::echo --bold "--${color}" "${resultstore_status}"
}

fx-standard-switches "$@"
set -- "${FX_ARGV[@]}"

if [[ $# -lt 1 ]]; then
  fx-error Invalid syntax
  fx-command-help
  exit 1
fi

action="$1"
shift
action_args=("$@")

function resultstore-read-config {
  RESULTSTORE_ENABLED=0
  if [[ ! -f "${RESULTSTORE_CONFIG}" ]]; then
    return 1
  fi
  source "${RESULTSTORE_CONFIG}"
  return 0
}

function resultstore-write-config {
  local enabled="$1"
  local -r tempfile="${RESULTSTORE_CONFIG}.tmp"

  cat > "${tempfile}" <<EOF
# Autogenerated config file for 'fx resultstore'.
# Run 'fx help resultstore' for more information.
RESULTSTORE_ENABLED=${enabled}
EOF
  # Only rewrite the config file if content has changed
  if ! cmp --silent "${tempfile}" "${RESULTSTORE_CONFIG}"
  then mv -f "${tempfile}" "${RESULTSTORE_CONFIG}"
  else rm -f "${tempfile}"
  fi
}

# Read config in a way that exit code is preserved but doesn't exit because
# of "set -e" if config file doesn't exist
__successfully_read_config=0
resultstore-read-config || __successfully_read_config="$?"

case "$action" in
  -h|--help)
    usage
    exit 0
    ;;

  status)
    echo "ResultStore uploading during builds is currently $(styled-status "$RESULTSTORE_ENABLED") for ${FUCHSIA_DIR}"
    echo "To change it, run: fx resultstore <enable|disable>"
    exit 0
    ;;

  enable)
    if [[ ! -x "${rsproxy_wrap}" ]]; then
      fx-warn "ResultStore cannot be enabled because the 'rsclient' prebuilt package is missing."
      fx-warn "Please run 'jiri sync' to download the required prebuilts."
      exit 1
    fi
    if [[ "$RESULTSTORE_ENABLED" -eq 1 ]]; then
      echo "ResultStore uploading during build is already enabled."
      exit 0
    fi
    RESULTSTORE_ENABLED=1
    resultstore-write-config "${RESULTSTORE_ENABLED}"
    echo "ResultStore uploading during build is enabled at user's request"
    ;;

  disable)
    if [[ "$RESULTSTORE_ENABLED" -eq 0 ]]; then
      if [[ "${__successfully_read_config}" -ne 0 ]]; then
        # if the feature is already disabled but the config file does not exist
        # or is inconsistent, we rewrite the file before exiting
        resultstore-write-config "${RESULTSTORE_ENABLED}"
      fi
      echo "ResultStore uploading during build is already disabled."
      exit 0
    fi
    RESULTSTORE_ENABLED=0
    resultstore-write-config "${RESULTSTORE_ENABLED}"
    echo "ResultStore uploading during build is disabled at user's request"
    ;;

  *)
    fx-error Invalid syntax
    fx-command-help
    exit 1
    ;;
esac

echo "ResultStore uploading during build is now $(styled-status "$RESULTSTORE_ENABLED") for ${FUCHSIA_DIR}"
