// Copyright 2020 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.

import 'dart:io';

import 'package:meta/meta.dart';
import 'package:fxutils/fxutils.dart';

const String analyticsScript = 'tools/devshell/lib/metrics_custom_report.sh';

/// Connection for `fx test` to log metrics to Google Analytics.
class AnalyticsReporter {
  /// Object that knows the location of all relevant Fuchsia artifacts. Used
  /// to turn relative paths into absolute paths.
  final IFxEnv fxEnv;

  /// Shell script able to send metrics to Google Analytics.
  ///
  /// Likely `tools/devshell/lib/metrics_custom_report.sh`
  final String reporterCmd;
  AnalyticsReporter({
    @required this.fxEnv,
    this.reporterCmd = analyticsScript,
  });

  /// No-op constructor useful for tests or when certain flags are passed,
  /// (e.g., `--dryrun`).
  AnalyticsReporter.noop()
      : reporterCmd = null,
        fxEnv = null;

  Future<void> report({
    @required String subcommand,
    @required String action,
    String label,
  }) async {
    if (reporterCmd == null) {
      return;
    }

    List<String> args = [
      '${fxEnv.fuchsiaDir}/$reporterCmd',
      subcommand,
      action,
    ];
    if (label != null && label != '') {
      args.add(label);
    }
    ProcessResult result = await Process.run('bash', args);
    if (result.exitCode != 0) {
      print(
        'Error ${result.exitCode} when running `bash ${args.join(' ')}`:'
        '${result.stderr}',
      );
    }
  }
}
