#!/bin/bash
# Copyright 2019 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=Other
### manage collection of metrics in fx tools

## usage:
##  fx metrics
##       Show what metrics are collected when enabled
##
##  fx metrics status
##       Show if metrics collection is enabled or disabled
##
##  fx metrics [--log=LOG_FILE] enable
##       Enable metrics collection in fx tools
##       --log=<LOG_FILE>  Log all metrics collected to LOG_FILE for
##                      debugging purposes. The LOG_FILE setting is persisted
##                      in a config file in the /tmp filesystem and will be
##                      reset when the user logs out.
##
##  fx metrics disable
##       Disable metrics collection in fx tools
##
## If you opt-in to metrics collection, data will be collected and used by
## Google in accordance with the Google privacy policy
## (https://policies.google.com/privacy)

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 $?
source "${FUCHSIA_DIR}/tools/devshell/lib/metrics.sh" || exit $?

function usage {
  show-what-is-collected
  fx-command-help
}

function show-what-is-collected {
  cat <<EOF
When enabled, this tool creates a random unique user ID (UUID) for the Fuchsia
repository and uses that to collect the following anonymized metrics of
the session and user workflow in order to improve the user experience:

1. For every "fx" invocation:
   - The output of "uname -rs" (Kernel name and release)
   - The version of the shell (bash or zsh)
   - The name of the "fx" subcommand invoked
   - (in the future) Imports in BUILDDIR/args.gn for product and board
   - (in the future) Value FUCHSIA_ARCH from BUILDDIR/fx.config

2. For the subcomand(s) [${_METRICS_TRACK_ALL_ARGS[@]}]:
   - All arguments passed to the subcommand

3. For the subcomand(s) [${_METRICS_TRACK_RESULTS[@]}]:
   - Time taken to complete
   - Exit status

4. Custom events for the subcommand(s): [${_METRICS_ALLOWS_CUSTOM_REPORTING[@]}]

When metrics collection is disabled, any existing UUID is deleted, and a
new UUID will be created if metrics is later re-enabled.

When enabled, the UUID and the status are stored in ${METRICS_CONFIG}

EOF
}

function describe-privacy-policy {
  cat << EOF
If you opt-in to metrics collection, data will be collected and used by Google
in accordance with the Google privacy policy
(https://policies.google.com/privacy)
EOF
}

function maybe-print-metrics-logfile-status {
  logfile=$(metrics-get-debug-logfile)
  if [[ $logfile ]]; then
    echo "Logging metrics collection for debugging purposes to $logfile"
  fi
}

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

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

if [[ $# -lt 1 ]]; then
  usage
  exit 1
fi

debug_logfile=
has_debug_logfile=0

while [[ $# -ne 0 ]]; do
  case "$1" in
  -h|--help)
    usage
    exit 0
    ;;
  --log)
    if [[ $# -lt 2 ]]; then
      fx-error Invalid syntax
      fx-command-help
      return 1
    fi
    has_debug_logfile=1
    debug_logfile=$2
    shift
    ;;
  enable|disable|status)
    action=$1
    ;;
  *)
    fx-error Invalid syntax
    fx-command-help
    exit 1
  esac
  shift
done

# 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
metrics-read-config || __successfully_read_config=$?

if [[ "$has_debug_logfile" -eq 1 ]]; then
  if [[ $action != "enable" ]]; then
    fx-error "Invalid syntax, you can only specify --log when enabling metrics"
    fx-command-help
    exit 1
  fi
  metrics-set-debug-logfile "${debug_logfile}"
fi

if [[ $action == "status" ]]; then
  echo "Collection of metrics is currently $(styled-status "$METRICS_ENABLED") for ${FUCHSIA_DIR}"
  maybe-print-metrics-logfile-status
  echo "To change it, run fx metrics <enable|disable>"
  if [[ $METRICS_ENABLED -eq 1 ]]; then
    echo
    show-what-is-collected
  fi
  exit 0
fi

if [[ $action == "enable" ]]; then
  maybe-print-metrics-logfile-status
  describe-privacy-policy
  if [[ $METRICS_ENABLED -eq 1 ]]; then
    echo "Metrics collection is already enabled."
    exit 0
  fi
  if [[ -z "${METRICS_UUID}" ]]; then
    uuidgen_cmd=uuidgen
    if ! command -v $uuidgen_cmd >/dev/null 2>&1 ; then
      fx-error "Command '$uuidgen_cmd' cannot be found, please add it to your PATH."
      exit 1
    fi
    METRICS_UUID=$($uuidgen_cmd)
  fi
  METRICS_ENABLED=1
  metrics-maybe-log "Metrics collection enabled at user's request"
elif [[ $action == "disable" ]]; then
  if [[ $METRICS_ENABLED -eq 0 ]]; then
    if [[ "${__successfully_read_config}" -ne 0 ]]; then
      # if metrics is already disabled but the config file does not exist or
      # is inconsistent, we rewrite the file before exiting
      metrics-write-config "${METRICS_ENABLED}" "${METRICS_UUID}"
    fi
    echo "Metrics collection is already disabled."
    exit 0
  fi
  METRICS_UUID=""
  METRICS_ENABLED=0
  metrics-maybe-log "Metrics collection disabled at user's request"
fi

metrics-write-config "${METRICS_ENABLED}" "${METRICS_UUID}" "${debug_logfile}"
echo "Collection of metrics is now $(styled-status $METRICS_ENABLED) for ${FUCHSIA_DIR}"
