// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.11

/// This tool gives a breakdown of code size by deferred part in the program.
library dart2js_info.bin.deferred_library_size;

import 'dart:math';

import 'package:args/command_runner.dart';

import 'package:dart2js_info/info.dart';
import 'package:dart2js_info/src/io.dart';

import 'usage_exception.dart';

/// This tool gives a breakdown of code size by deferred part in the program.
class DeferredLibrarySize extends Command<void> with PrintUsageException {
  @override
  final String name = "deferred_size";
  @override
  final String description = "Show breakdown of codesize by deferred part.";

  @override
  void run() async {
    var args = argResults.rest;
    if (args.isEmpty) {
      usageException('Missing argument: info.data');
    }
    // TODO(het): Would be faster to only parse the 'outputUnits' part
    var info = await infoFromFile(args.first);
    var sizeByImport = getSizeByImport(info);
    printSizes(sizeByImport, info.program.size);
  }
}

class ImportSize {
  final String import;
  final int size;

  const ImportSize(this.import, this.size);

  @override
  String toString() {
    return '$import: $size';
  }
}

void printSizes(Map<String, int> sizeByImport, int programSize) {
  var importSizes = <ImportSize>[];
  sizeByImport.forEach((import, size) {
    importSizes.add(ImportSize(import, size));
  });
  // Sort by size, largest first.
  importSizes.sort((a, b) => b.size - a.size);
  int longest = importSizes.fold('Percent of code deferred'.length,
      (longest, importSize) => max(longest, importSize.import.length));

  printRow(label, data, {int width = 15}) {
    print('${label.toString().padRight(longest + 1)}'
        '${data.toString().padLeft(width)}');
  }

  print('');
  print('Size by library');
  print('-' * (longest + 16));
  for (var importSize in importSizes) {
    // TODO(het): split into specific and shared size
    printRow(importSize.import, importSize.size);
  }
  print('-' * (longest + 16));

  var mainChunkSize = sizeByImport['main'];
  var deferredSize = programSize - mainChunkSize;
  var percentDeferred = (deferredSize * 100 / programSize).toStringAsFixed(2);
  printRow('Main chunk size', mainChunkSize);
  printRow('Deferred code size', deferredSize);
  printRow('Percent of code deferred', '$percentDeferred%');
}

Map<String, int> getSizeByImport(AllInfo info) {
  var sizeByImport = <String, int>{};
  for (var outputUnit in info.outputUnits) {
    if (outputUnit.name == 'main' || outputUnit.name == null) {
      sizeByImport['main'] = outputUnit.size;
    } else {
      for (var import in outputUnit.imports) {
        sizeByImport.putIfAbsent(import, () => 0);
        sizeByImport[import] += outputUnit.size;
      }
    }
  }
  return sizeByImport;
}
