class Metric:
    ValueKind_UINT32 = 1
    ValueKind_UINT64 = 2
    ValueKind_FLOAT = 3
    ValueKind_DOUBLE = 4
    ValueKind_STRING = 5

    def __init__(self, kind, value):
        self._kind = kind
        self._value = value

    def has_value(self):
        return True

    def kind(self):
        return self._kind

    def as_uint64(self):
        return self._value

    def value(self):
        return self._value

    def unit(self):
        return "count"


class Action:
    def __init__(self):
        self.metrics = {
            "uint32.max": Metric(1, 2**32 - 1),
            "uint64.signed_boundary": Metric(2, 2**63),
            "uint64.signed_boundary_plus_one": Metric(2, 2**63 + 1),
            "uint64.max": Metric(2, 2**64 - 1),
            "fallback.signed": Metric(99, -42),
        }

    def name(self):
        return "uint_boundaries"

    def metric_names(self):
        return tuple(self.metrics)

    def metric_by_name(self, name):
        return self.metrics[name]


class Range:
    def num_actions(self):
        return 1

    def action_by_idx(self, index):
        return Action()


class Report:
    def get_version(self):
        return "2099.1"

    def num_ranges(self):
        return 1

    def range_by_idx(self, index):
        return Range()


def load_report(path):
    return Report()
