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):
        print('use env 1')
        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 self.old_life <= (100 - (self.grade % 100)) and self.deadrate > 0.6:
            self.reward += 10000
        if random.uniform(0, 1)<self.deadrate:
            exp = self.grade*0.5
            return exp
        else:
            exp = 0
            self.life -= 5
            # self.life -= 20
            self.reward -= 5
            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
        elif (self.old_grade < 200 and self.grade >= 200 and self.upgrade2 == 0):
            self.life += 70
            self.upgrade2 = 1
        elif self.grade >= 300:
            self.reward += 10000
            self.terminate = True
        elif self.life <= 0:
            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.015 * (self.grade - 100 * level)
        # if (self.grade - 100 * level) > 65:
        #     self.deadrate = 0.99
        # else:
        #     self.deadrate = 0.01
        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