#!/usr/bin/env dart
// Copyright (c) 2018, 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.

import 'dart:io';

import 'package:kernel/kernel.dart';
import 'package:kernel/binary/ast_from_binary.dart';

import 'util.dart';

void usage() {
  print("Gives an overview of which parts of the dill file");
  print("contributes how many bytes.");
  print("");
  print("Usage: dart <script> dillFile.dill");
  print("The given argument should be an existing file");
  print("that is valid to load as a dill file.");
  exit(1);
}

main(args) {
  CommandLineHelper.requireExactlyOneArgument(true, args, usage);
  List<int> bytes = new File(args[0]).readAsBytesSync();
  try {
    Program p = new Program();
    new WrappedBinaryBuilder(bytes).readProgram(p);
  } catch (e) {
    print("Argument given isn't a dill file that can be loaded.");
    usage();
  }
}

class WrappedBinaryBuilder extends BinaryBuilder {
  WrappedBinaryBuilder(var _bytes) : super(_bytes, disableLazyReading: true);

  void readStringTable(List<String> table) {
    int size = -byteOffset;
    super.readStringTable(table);
    size += super.byteOffset;
    print("String table: ${_bytesToReadable(size)}.");
  }

  void readLinkTable(CanonicalName linkRoot) {
    int size = -byteOffset;
    super.readLinkTable(linkRoot);
    size += super.byteOffset;
    print("Link table: ${_bytesToReadable(size)}.");
  }

  Map<Uri, Source> readUriToSource() {
    int size = -byteOffset;
    var result = super.readUriToSource();
    size += super.byteOffset;
    print("URI to sources map: ${_bytesToReadable(size)}.");
    return result;
  }

  void readConstantTable() {
    int size = -byteOffset;
    super.readConstantTable();
    size += super.byteOffset;
    print("Constant table: ${_bytesToReadable(size)}.");
  }

  Library readLibrary(Program program, int endOffset) {
    int size = -byteOffset;
    var result = super.readLibrary(program, endOffset);
    size += super.byteOffset;
    print("Library '${result.importUri}': ${_bytesToReadable(size)}.");
    return result;
  }

  String _bytesToReadable(int size) {
    const List<String> what = const ["B", "KB", "MB", "GB", "TB"];
    int idx = 0;
    double dSize = size + 0.0;
    while ((idx + 1) < what.length && dSize >= 512) {
      ++idx;
      dSize /= 1024;
    }
    return "${dSize.toStringAsFixed(1)} ${what[idx]} ($size B)";
  }
}
