#  Copyright (c) PARRRATE T&V 2021. All rights reserved.

import random
import shutil
from pathlib import Path

from bu4.common_interface import with_common_interface
from bu4.evaluation.constructs.proxy import antiproxy, eproxy
from bu4.evaluation.sync import sync
from bu4.isynced import isynced as synced
from bu4.linkable.toolchain.readfile import readfile
from bu4.tracing.deep_trace import deep_trace
from timesample import TimeSample

shutil.rmtree(Path('compiled'), ignore_errors=True)
with TimeSample('all'):
    with TimeSample('sys0'):
        with TimeSample('compilation'):
            sys0 = synced(readfile('src/sys0'))
        with TimeSample('first, AP'):
            TimeSample.print(
                antiproxy(sys0)(0)(1)(
                    lambda a: lambda b: a + b
                )(
                    lambda n: lambda x: lambda y: x if n == 0 else y
                )(
                    lambda n: lambda x: lambda y: x if n & 1 else y
                )(
                    lambda n: n >> 1
                )
            )
        with TimeSample('second, AP'):
            TimeSample.print(
                antiproxy(sys0)(0)(1)(
                    lambda a: lambda b: a + b
                )(
                    lambda n: lambda x: lambda y: x if n == 0 else y
                )(
                    lambda n: lambda x: lambda y: x if n & 1 else y
                )(
                    lambda n: n >> 1
                )
            )
        with TimeSample('third, EP'):
            sys0 = with_common_interface(sys0)
            TimeSample.print(sys0)
    with TimeSample('sys2'):
        with TimeSample('compilation'):
            sys2c = synced(readfile('src/sys2'))
        with TimeSample('runtime'):
            sys2 = sys2c
            sys2 = with_common_interface(sys2)
            TimeSample.print(sys2)
        with TimeSample('runtime'):
            sys2 = sys2c
            sys2 = with_common_interface(sys2)
            TimeSample.print(sys2)
    with TimeSample('sys3'):
        sys3 = with_common_interface(synced(readfile('src/sys3')))
        sys3 = sync(sys3.call(eproxy(5)))
        TimeSample.print(sys3)
    with TimeSample('sys1'):
        sys1 = with_common_interface(synced(readfile('src/sys1')))
        random.seed(42)
        sys1 = sync(sys1.call(eproxy(random.randrange(2 ** 10))))
        sys1 = sync(sys1.call(eproxy(random.randrange(2 ** 10))))
        sys1 = sync(sys1.call(eproxy(random.randrange(2 ** 10))))
        TimeSample.print(sys1)
    with TimeSample('sys4'):
        TimeSample.print(with_common_interface(synced(readfile('src/sys4'))))
    with TimeSample('sys5'):
        sys5 = synced(readfile('src/sys5'))
        print(deep_trace(sys5))
    with TimeSample('sys6'):
        with TimeSample('compilation'):
            sys6 = synced(readfile('src/sys6')).call(synced('?'))
        with TimeSample('runtime'):
            for _ in range(100):
                sys6 = sys6.next()
                # print(sys6)
            for _ in range(10000000):
                sys6 = sys6.next()