#!/usr/bin/env fuchsia-vendored-python
#
# Copyright 2022 The Fuchsia 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 argparse
import re
import sys

from snapshot import Snapshot

group_specs = [
    ["[scudo]", "scudo:.*"],
    ["[relro]", "relro:.*"],
    ["[stacks]", "thrd_t:0x.*|initial-thread|pthread_t:0x.*"],
    ["[data]", "data[0-9]*:.*"],
    ["[blobs]", "blob-[0-9a-f]+"],
    ["[inactive-blobs]", "inactive-blob-[0-9a-f]+"],
    ["[mrkls]", "mrkl-[0-9a-f]+"],
    ["[uncompressed-bootfs]", "uncompressed-bootfs"],
]

for gs in group_specs:
    gs[1] = re.compile(gs[1])


def main(args):
    snapshot = Snapshot.FromJSONFile(
        sys.stdin) if args.snapshot is None else Snapshot.FromJSONFilename(
            args.snapshot)
    vmo_to_count = {}
    for p in snapshot.processes.values():
        for v in p.vmos:
            if v.koid in vmo_to_count:
                vmo_to_count[v.koid] += 1
            else:
                vmo_to_count[v.koid] = 1
    nodes = []
    snaphot_name = 'Snapshot'
    kernel_name = 'Kernel'
    nodes.append(["Orphaned", snaphot_name, 0])
    nodes.append(["Orphaned VMOs", "Orphaned", snapshot.orphaned])
    nodes.append([kernel_name, snaphot_name, 0])
    nodes.append(["Wired", kernel_name, snapshot.kernel.wired])
    nodes.append(["Heap", kernel_name, snapshot.kernel.total_heap])
    nodes.append(["IPC", kernel_name, snapshot.kernel.ipc])
    nodes.append(["Other", kernel_name, snapshot.kernel.other])
    nodes.append(["MMU", kernel_name, snapshot.kernel.mmu])
    for p in snapshot.processes.values():
        process_name = "%s<%d>" % (p.name, p.koid)
        nodes.append([process_name, snaphot_name, 0])
        groups = {}
        for v in p.vmos:
            group_name = None
            for gs in group_specs:
                if gs[1].match(v.name):
                    group_name = "%s<%d>" % (gs[0], p.koid)
                    if gs[0] not in groups:
                        nodes.append([group_name, process_name, 0])
                        groups[gs[0]] = True
                    break
            vmo_name = "%s<%d:%d>" % (v.name, p.koid, v.koid)
            nodes.append([
                vmo_name,
                process_name if group_name is None else group_name,
                float(v.committed_bytes) / vmo_to_count[v.koid]
            ])
    template = '''\
<html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['treemap']});
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Process','Parent','Size (MB)'],
          ['Snapshot',null,0],
            %s
        ]);

        tree = new google.visualization.TreeMap(document.getElementById('chart_div'));

        tree.draw(data, {
          headerHeight: 15,
          fontColor: 'black',
          generateTooltip: showTooltip,
          maxDepth: 2,
          enableHighlight: true,
          minHighlightColor: '#8c6bb1',
          midHighlightColor: '#9ebcda',
          maxHighlightColor: '#edf8fb',
          minColor: '#009688',
          midColor: '#f7f7f7',
          maxColor: '#ee8100'
        });

        function showTooltip(row, size, value) {
          return '<div style="background:#fd9; padding:10px; border-style:solid">' + data.getValue(row, 0) + ' ' + size.toFixed(2) + 'MB</div>';
        }

      }
    </script>
  </head>
  <body>
    <div id="chart_div" style="width: 100%%; height: 100%%;"></div>
  </body>
</html>
'''
    node_strings = '\n'.join([
        "[\'%s\',\'%s\',%.2g]," % (n[0], n[1], round(n[2] / (1024.0 * 1024), 2))
        for n in nodes
    ])
    print(template % node_strings)


def get_arg_parser():
    parser = argparse.ArgumentParser(description='Convert snapshot to tree.')
    parser.add_argument('-s', '--snapshot')
    return parser


if __name__ == '__main__':
    main(get_arg_parser().parse_args())
