import 'dart:convert' show jsonDecode;
import 'dart:io';

void main(List<String> args) {
  var jsonPath = args[0];
  var json =
      jsonDecode(File(jsonPath).readAsStringSync()) as Map<String, Object>;
  var changes = json['changes'] as Map<String, Object>;
  var byPath = changes['byPath'] as Map<String, Object>?;
  if (args.isEmpty) {
    print('''
Usage: summary_stats.dart <summary_file> [category_name]

Prints statistics of `dart migrate` suggestions summary, created with the
`--summary` flag of `dart migrate`.

If [category_name] is not given, this prints the total number of suggestions
which the tool made, per category.

If [category_name] is given, this prints the file names and suggestion counts of
each file with one or more suggestions categorized as [category_name].
''');
  } else if (args.length == 1) {
    _printTotals(byPath!);
  } else {
    var category = args[1];
    _printCategory(byPath!, category);
  }
}

/// Prints the file names and counts of files with suggestions of [category].
void _printCategory(Map<String, Object> byPath, String category) {
  byPath.forEach((String path, Object value) {
    var counts = value as Map<String, Object>;
    if (counts.containsKey(category)) {
      print('$path: ${counts[category]}');
    }
  });
}

/// Prints the total number of suggestions for each category.
void _printTotals(Map<String, Object> byPath) {
  var summary = <String, int>{};
  for (var file in byPath.values.cast<Map<Object, Object>>()) {
    file.forEach((category, count) {
      summary[category as String] = (summary[category] ?? 0) + (count as int);
    });
  }
  var categories = summary.keys.toList()..sort();
  for (var category in categories) {
    print('$category:  ${summary[category]}');
  }
}
