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

import 'dart:async';
import 'dart:convert';
import 'sl4f_client.dart';

/// Result from each test step. Usually each step denotes a separate test case
/// but it depends on what `fuchsia.test.Suite#GetTests()` returns.
class TestStep {
  /// Name of the step.
  String name;

  /// Outcome of running step (passed, failed, inconclusive).
  String outcome;

  /// Time taken by test to run.
  int duration_ms; // ignore: non_constant_identifier_names

  /// Path to log file.
  String primary_log_path; // ignore: non_constant_identifier_names

  /// Artifacts generated by a test step. The values can be string and numbers.
  Map<String, dynamic> artifacts;

  @override
  String toString() {
    return jsonEncode(this);
  }

  dynamic toJson() => {
        'name': name,
        'outcome': outcome,
        'duration_ms': duration_ms,
        'primary_log_path': primary_log_path,
        'artifacts': jsonEncode(artifacts)
      };
}

/// Result of a single test.
class TestResult {
  /// Outcome of running this test ("passed" if every step passes else "failed").
  String outcome;

  /// Total time taken to run this test.
  int duration_ms; // ignore: non_constant_identifier_names

  /// Log path which contains all logs for this test.
  String primary_log_path; // ignore: non_constant_identifier_names

  /// Series of steps for this test.
  List<TestStep> steps;

  /// Test completed successfully.
  bool successful_completion; // ignore: non_constant_identifier_names

  @override
  String toString() {
    return jsonEncode(this);
  }

  dynamic toJson() => {
        'outcome': outcome,
        'duration_ms': duration_ms,
        'primary_log_path': primary_log_path,
        'steps': jsonEncode(steps)
      };
}

class Test {
  final Sl4f _sl4f;

  Test([Sl4f sl4f]) : _sl4f = sl4f ?? Sl4f.fromEnvironment();

  Future<TestResult> runTest(String test) async {
    final Map<String, dynamic> response =
        await _sl4f.request('test_facade.RunTest', {'test': test});
    TestResult result = TestResult()
      ..outcome = response['outcome']
      ..duration_ms = response['duration_ms']
      ..primary_log_path = response['primary_log_path']
      ..successful_completion = response['successful_completion'];

    if (response.containsKey('steps')) {
      result.steps = <TestStep>[];
      for (dynamic dynStep in response['steps']) {
        TestStep step = TestStep()
          ..name = dynStep['name']
          ..outcome = dynStep['outcome']
          ..duration_ms = dynStep['duration_ms']
          ..primary_log_path = dynStep['primary_log_path']
          ..artifacts = dynStep['artifacts'];
        result.steps.add(step);
      }
    }
    return result;
  }
}
