#####################################################
# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2021.05 #
#####################################################
import math
from .synthetic_utils import TimeStamp
from .synthetic_env import SyntheticDEnv
from .math_core import LinearFunc
from .math_core import DynamicLinearFunc
from .math_core import DynamicQuadraticFunc
from .math_core import ConstantFunc, ComposedSinFunc
from .math_core import GaussianDGenerator


__all__ = ["TimeStamp", "SyntheticDEnv", "get_synthetic_env"]


def get_synthetic_env(total_timestamp=1000, num_per_task=1000, mode=None, version="v1"):
    if version == "v1":
        mean_generator = ConstantFunc(0)
        std_generator = ConstantFunc(1)
        data_generator = GaussianDGenerator(
            [mean_generator], [[std_generator]], (-2, 2)
        )
        time_generator = TimeStamp(
            min_timestamp=0, max_timestamp=math.pi * 8, num=total_timestamp, mode=mode
        )
        oracle_map = DynamicLinearFunc(
            params={
                0: ComposedSinFunc(params={0: 2.0, 1: 1.0, 2: 2.2}),
                1: ComposedSinFunc(params={0: 1.5, 1: 0.6, 2: 1.8}),
            }
        )
        dynamic_env = SyntheticDEnv(
            data_generator, oracle_map, time_generator, num_per_task
        )
    else:
        raise ValueError("Unknown version: {:}".format(version))
    return dynamic_env