import random

from lib.utils import TensorList


class TrackerParams:
    """
    Class for tracker parameters.
    """

    def set_default_values(self, default_vals: dict):
        for name, val in default_vals.items():
            if not hasattr(self, name):
                setattr(self, name, val)

    def get(self, name: str, *default):
        """
        Get a parameter value with the given name. If it does not exists, it return the default value given as a
        second argument or returns an error if no default value is given.
        """

        if len(default) > 1:
            raise ValueError('ERROR: can only give one default value')

        if not default:
            return getattr(self, name)
        return getattr(self, name, default[0])

    def has(self, name: str):
        """
        Check if there exist a parameter with the given name.
        """

        return hasattr(self, name)


class FeatureParams:
    """
    Class for feature specific parameters.
    """

    def __init__(self, *args, **kwargs):
        if len(args) > 0:
            raise ValueError

        for name, val in kwargs.items():
            if isinstance(val, list):
                setattr(self, name, TensorList(val))
            else:
                setattr(self, name, val)


def Choice(*args):
    """
    Can be used to sample random parameter values.
    """

    return random.choice(args)
