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

import 'dart:io' as io;

// It's bad to import a file from `bin` into `tool`.
// However this tool is not very important, so delete it if necessary.
import '../bin/utils/adb_logcat_filtering.dart';

/// A tiny tool to read saved `adb logcat` output and perform some analysis.
///
/// This tool is not meant to be a full-fledged logcat reader. It's just a
/// simple tool that uses the [AdbLogLine] extension type to parse results of
/// `adb logcat` and explain what log tag names are most common.
void main(List<String> args) {
  if (args case [final String path]) {
    final List<AdbLogLine> parsed = io.File(path)
        .readAsLinesSync()
        .map(AdbLogLine.tryParse)
        .whereType<AdbLogLine>()
          // Filter out all debug logs.
        .where((AdbLogLine line) => line.severity != 'D')
        .toList();

    final Map<String, int> tagCounts = <String, int>{};
    for (final AdbLogLine line in parsed) {
      tagCounts[line.name] = (tagCounts[line.name] ?? 0) + 1;
    }

    // Print in order of most common to least common.
    final List<MapEntry<String, int>> sorted = tagCounts.entries.toList()
      ..sort((MapEntry<String, int> a, MapEntry<String, int> b) => b.value.compareTo(a.value));
    for (final MapEntry<String, int> entry in sorted) {
      print("'${entry.key}', // ${entry.value}");
    }

    return;
  }

  print('Usage: logcat_reader.dart <path-to-logcat-output>');
  io.exitCode = 1;
}
