// Copyright 2020 The Flutter team. 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:path/path.dart' as p;

import 'common.dart';

void main() async {
  final packageDirs =
      listPackageDirs(Directory.current)
          .map((path) => p.relative(path, from: Directory.current.path))
          .where((path) => !p.dirname(path).startsWith('_'))
          .toList();

  print('Package dirs:\n${packageDirs.map((path) => '  $path').join('\n')}');

  final results = <bool>[];
  for (var i = 0; i < packageDirs.length; i++) {
    final dir = packageDirs[i];
    logWrapped(ansiMagenta, '\n$dir (${i + 1} of ${packageDirs.length})');

    final upgradeResult = await run(dir, 'flutter', [
      'pub',
      'pub',
      'upgrade',
      '--no-precompile',
    ]);

    results.add(upgradeResult);
    if (!upgradeResult) {
      // skipping analyze when `pub upgrade` fails.
      results.add(false);
      continue;
    }
    results.add(
      await run(dir, 'dart', [
        'analyze',
        '--fatal-infos',
        '--fatal-warnings',
        '.',
      ]),
    );
    _printStatus(results);
  }

  if (results.any((v) => !v)) {
    exitCode = 1;
  }
}

void _printStatus(List<bool> results) {
  var successCount = results.where((t) => t).length;
  var success = (successCount == results.length);
  var pct = 100 * successCount / results.length;

  logWrapped(
    success ? ansiGreen : ansiRed,
    '$successCount of ${results.length} (${pct.toStringAsFixed(2)}%)',
  );
}
