import random
import copy
class action_space():
    def __init__(self, action_list):
        self.n = len(action_list)
        self.action_list = action_list
    def sample(self):
        return random.choice(self.action_list)
class sandbox():
    def __init__(self):
        self.action_space = action_space([0, 1])
        self.upspeed = 2
        self.deadrate0 = 0.1
        self.deadrate1 = 0.4
        self.deadrate2 = 0.7
        self.add_life = 70
        self.grade_line = 100
    def reset(self):
        self.age = 0
        self.life = 70
        self.grade = 0
        self.upgrade1 = 0
        self.upgrade2 = 0

        return [self.age, self.life, self.grade], {}
    def attack(self):
        if random.uniform(0, 1)<self.deadrate:
            exp = self.grade*0.5
            if self.old_life <= (100 - (self.grade % 100))  and exp > (100 - self.grade % 100):
            # if (self.old_life <= (100 - self.grade % 100)):
                self.reward += exp * 1000
                # self.reward += 100000
            return exp
        else:
            exp = 0
            if (self.old_life > (100 - self.grade % 100)):
                self.life -= 30
                self.reward -= 100000
            return exp
    def sleep(self):
        return self.upspeed
    def change_life_year(self):
        self.life -= 1
        self.age += 1
    def update_life_and_grade(self, action):
        if (self.old_grade < 100 and self.grade >= 100 and self.upgrade1 == 0):
            self.life += 70
            self.upgrade1 = 1
            # if action == 1:
            #     self.reward += 500
        elif (self.old_grade < 200 and self.grade >= 200 and self.upgrade2 == 0):
            self.life += 70
            self.upgrade2 = 1
            # if action == 1:
            #     self.reward += 1000
        elif self.grade >= 300:
            self.reward += 10000
            self.terminate = True
        elif self.life <= 0:
            if action == 0:
                self.reward -= 10000
            else:
                self.reward -= -10000
            self.terminate = True
        else:
            pass
    def step(self, action):

        self.old_life = copy.deepcopy(self.life)
        self.old_grade = copy.deepcopy(self.grade)
        self.change_life_year()
        self.reward = 0
        self.terminate = False
        level = (self.grade // 100)
        # self.deadrate = 0.025 * (self.age - 50 - 70 * level) + 0.5
        self.deadrate = 0.01 * ((self.grade - 100 * level) - 50) + 0.5
        if action == 1:
            exp = self.attack()
        else:
            exp = self.sleep()
        self.reward += exp
        self.grade += exp
        self.update_life_and_grade(action)
        return [self.age, self.life, self.grade], self.reward, self.terminate, False, None