#!/usr/bin/env yacl

from yacl_base import *
import yacl_eval
import yacl_execute


class A(YaclBaseClass):
    # _execute = yacl_execute.json_serializer()
    _execute = lambda result: True  # For performance testing.

    foo = 123


class M(GenericMixin, ABC):
    def foo():
        return get() * 1000


class Z(GenericMixin, ABC):
    def foo():
        return get() * 1000000


class B(M, Z, A):
    def foo():
        return get() * 2


r = r"""
{"a": 5,
 "b": 42}
"""

import json

for key, value in json.loads(r).items():
    setattr(B, key, value)

negation = lambda: -get()


class C(B):
    a = negation
    b = negation
    d = 3.14
    e = 'acd'

    def f():
        return str(get('d') + get('a')) + get('e')

    x01 = 123
    x02 = 123
    x03 = 123
    x04 = 123
    x05 = 123
    x06 = 123
    x07 = 123
    x08 = 123
    x09 = 123
    x10 = 123
    x11 = 123
    x12 = 123
    x13 = 123
    x14 = 123
    x15 = 123
    x16 = 123
    x17 = 123
    x18 = 123
    x19 = 123
    x20 = 123


class D(B):
    a = negation
    b = negation
    d = 3.14
    e = 'acd'

    def f():
        return str(get('d') + get('a')) + get('e')

    x01 = lambda: 123
    x02 = lambda: 123
    x03 = lambda: 123
    x04 = lambda: 123
    x05 = lambda: 123
    x06 = lambda: 123
    x07 = lambda: 123
    x08 = lambda: 123
    x09 = lambda: 123
    x10 = lambda: 123
    x11 = lambda: 123
    x12 = lambda: 123
    x13 = lambda: 123
    x14 = lambda: 123
    x15 = lambda: 123
    x16 = lambda: 123
    x17 = lambda: 123
    x18 = lambda: 123
    x19 = lambda: 123
    x20 = lambda: 123


import yacl_eval

repeat = 10000

import time

for cls in [C, D]:
    print(cls)
    t1 = time.time()
    for i in range(repeat):
        yacl_eval.go(cls)
    t2 = time.time()
    print(f"Time: {(t2 - t1) * 1000.0 / repeat} ms per eval call")
    print(f"Time: {repeat / (t2 - t1)} calls per second")

    t1 = time.time()
    yacl_eval.go(cls, context_set=[{} for _ in range(repeat)])
    t2 = time.time()

    print(f"Time: {(t2 - t1) * 1000.0 / repeat} ms per context_item")
    print(f"Time: {repeat / (t2 - t1)} context_items per second")
    print()
