// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: avoid_print

import 'dart:io';

import 'package:lcov_parser/lcov_parser.dart' as lcov;

// Please update these targets when you update this package.
// Please ensure that test coverage continues to be 100%.
const int targetLines = 2127;
const String targetPercent = '64';
// TODO(Hixie): Update tests to return coverage to 100%, https://github.com/flutter/packages/pull/2493
const String lastUpdate = '2021-08-30';

Future<void> main(List<String> arguments) async {
  // This script is mentioned in the README.md file.

  final Directory coverageDirectory = Directory('coverage');

  if (coverageDirectory.existsSync()) {
    coverageDirectory.deleteSync(recursive: true);
  }

  final ProcessResult result = Process.runSync(
    'flutter',
    <String>['test', '--coverage'],
  );
  if (result.exitCode != 0) {
    print(result.stdout);
    print(result.stderr);
    print('Tests failed.');
    // leave coverage directory around to aid debugging
    exit(1);
  }

  if (Platform.environment['CHANNEL'] != 'master') {
    print(
      'Tests passed. (Coverage verification skipped; not on master channel.)',
    );
    coverageDirectory.deleteSync(recursive: true);
    exit(0);
  }

  final List<lcov.Record> records = await lcov.Parser.parse(
    'coverage/lcov.info',
  );
  int totalLines = 0;
  int coveredLines = 0;
  for (final lcov.Record record in records) {
    totalLines += record.lines?.found ?? 0;
    coveredLines += record.lines?.hit ?? 0;
  }
  if (totalLines == 0 || totalLines < coveredLines) {
    print('Failed to compute coverage.');
    exit(1);
  }

  final String coveredPercent =
      (100.0 * coveredLines / totalLines).toStringAsFixed(1);

  // We only check the TARGET_LINES matches, not the TARGET_PERCENT,
  // because we expect the percentage to drop over time as Dart fixes
  // various bugs in how it determines what lines are coverable.
  if (coveredLines < targetLines) {
    print('');
    print('                  ╭──────────────────────────────╮');
    print('                  │ COVERAGE REGRESSION DETECTED │');
    print('                  ╰──────────────────────────────╯');
    print('');
    print(
      'Coverage has reduced to only $coveredLines lines ($coveredPercent%). This is lower than',
    );
    print(
      'it was as of $lastUpdate, when coverage was $targetPercent%, covering $targetLines lines.',
    );
    print(
      'Please add sufficient tests to get coverage back to 100%, and update',
    );
    print(
      'test_coverage/bin/test_coverage.dart to have the appropriate targets.',
    );
    print('');
    print(
      'When in doubt, ask @Hixie for advice. Thanks!',
    );
    exit(1);
  } else {
    if (coveredLines < totalLines) {
      print(
        'Warning: Coverage of package:rfw is no longer 100%. (Coverage is now $coveredPercent%.)',
      );
    }
    if (coveredLines > targetLines) {
      print(
        'test_coverage/bin/test_coverage.dart should be updated to have a new target ($coveredLines).',
      );
    }
  }

  coverageDirectory.deleteSync(recursive: true);
}
