#!/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.

### 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
##

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 following subcomand(s) [${TRACK_ALL_ARGS}]:
   - All arguments passed to the subcommand

3. (in the future) For the following subcomand(s) [${TRACK_RESULTS}]:
   - Time taken to complete
   - Exit status

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 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

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

# 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 [[ $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
  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}"
echo "Collection of metrics is now $(styled-status $METRICS_ENABLED) for ${FUCHSIA_DIR}"

