# 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 functools
import json


class VMO(object):
    def __init__(self, v, names):
        self.koid = int(v[0])
        self.name = names[v[1]]
        self.parent_koid = int(v[2])
        self.committed_bytes = int(v[3])
        self.allocated_bytes = int(v[4])

    def __hash__(self):
        return hash((self.koid, self.name))

    def __eq__(self, other):
        return self.koid == other.koid and self.name == other.name

    def __ne__(self, other):
        return not self.__eq__(other)

    def __repr__(self):
        return "VMO %d (%s)" % (self.koid, self.name)


class Process(object):
    def __init__(self, p, vmos):
        self.koid = int(p[0])
        self.name = p[1]
        self.vmos = [vmos[int(v)] for v in p[2]]

    def __hash__(self):
        return hash((self.koid, self.name))

    def __eq__(self, other):
        return self.koid == other.koid and self.name == other.name

    def __ne__(self, other):
        return not self.__eq__(other)

    def __str__(self):
        return self.full_name

    def __repr__(self):
        return self.__str__()

    @property
    def full_name(self):
        return "%s[%d]" % (self.name, self.koid)


class Kernel(object):
    def __init__(self, k):
        self.wired = k["wired"]
        self.total_heap = k["total_heap"]
        self.mmu = k["mmu"]
        self.ipc = k["ipc"]
        self.other = k["other"]
        self.vmo = k["vmo"]


class Snapshot(object):
    @classmethod
    def FromJSON(cls, snap_json):
        return Snapshot(snap_json)

    @classmethod
    def FromJSONFile(cls, snap_file):
        return cls.FromJSON(json.load(snap_file))

    @classmethod
    def FromJSONString(cls, snap_string):
        return cls.FromJSON(json.loads(snap_string))

    @classmethod
    def FromJSONFilename(cls, snap_filename):
        with open(snap_filename) as snap_file:
            return cls.FromJSONFile(snap_file)

    def __init__(self, snap_json):
        vmo_names = snap_json["VmoNames"]
        self.kernel = Kernel(snap_json["Kernel"])
        self.vmos = {v[0]: VMO(v, vmo_names) for v in snap_json["Vmos"][1:]}
        self.processes = {
            p[0]: Process(p, self.vmos) for p in snap_json["Processes"][1:]
        }
        vmo_bytes = 0
        for v in self.vmos.values():
            vmo_bytes += v.committed_bytes
        self.orphaned = self.kernel.vmo - vmo_bytes
