from gym import spaces


class Parameter(object):
    def __init__(self, name, value=0.0, min_value=0, max_value=2, meta=None, trainable=True):
        self.name = name
        self.trainable = trainable
        self.meta = meta
        self.value = value
        self.min_value = min_value
        self.max_value = max_value + 1

        # gym.space.Discrete is within [0, 1, 2, ..., n-1]
        if self.min_value < 0:
            self.scale_factor = abs(self.min_value)
        elif self.min_value > 0:
            self.scale_factor = -self.min_value
        else:
            self.scale_factor = 0

    def space_size(self):
        return self.max_value + self.scale_factor

    def space(self):
        return spaces.Discrete(self.max_value + self.scale_factor)

    def to_param_value(self, policy_v):
        self.value = policy_v - self.scale_factor
        assert self.min_value <= self.value <= self.max_value
        return int(self.value)