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

import 'dart:io';
import 'package:path/path.dart' as path;

/// Count the number of libraries that import globals_null_migrated.dart and globals.dart in lib and test.
///
/// This must be run from the flutter_tools project root directory.
void main() {
  final Directory sources = Directory(path.join(Directory.current.path, 'lib'));
  final Directory tests = Directory(path.join(Directory.current.path, 'test'));
  countGlobalImports(sources);
  countGlobalImports(tests);
}

final RegExp globalImport = RegExp(r"import.*(?:globals|globals_null_migrated)\.dart' as globals;");
final RegExp globalNullUnsafeImport = RegExp("import.*globals.dart' as globals;");

void countGlobalImports(Directory directory) {
  int count = 0;
  int nullUnsafeImportCount = 0;
  for (final FileSystemEntity file in directory.listSync(recursive: true)) {
    if (!file.path.endsWith('.dart') || file is! File) {
      continue;
    }
    final List<String> fileLines = file.readAsLinesSync();
    final bool hasImport = fileLines.any((String line) {
      return globalImport.hasMatch(line);
    });
    if (hasImport) {
      count += 1;
    }
    final bool hasUnsafeImport = fileLines.any((String line) {
      return globalNullUnsafeImport.hasMatch(line);
    });
    if (hasUnsafeImport) {
      nullUnsafeImportCount += 1;
    }
  }
  print('${path.basename(directory.path)} contains $count libraries with global usage ($nullUnsafeImportCount unsafe)');
}
