class LevelLoader:
    """Handles loading in maps"""

    def __init__(self, surface, enemy_manager):
        """Constructor"""
        self.surface = surface
        self.enemy_manager = enemy_manager
        self.terrain_objects = []
        self.gun_objects = []
        self.enemies = []
        self.end_of_level = False
        self.collide_flag = False
        self.counter = 0
        self.collide = CollisionManager()
        
        # Level ASCII keys
        self.level_one_key = "////////////////////////////////////////////////////////////" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSSSSSSSSSSSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSSSSXSSSSSSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SXSSSSSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "//////SSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSS///////SSSSSSSSSSSSSSSS///SSSSS//SSSSS////SSSSSSSS/" \
                             "/SSSSSS//SSSSSSSSSSSSSSSXSSSSSSSSXSSSSSSSXSSSSSSXSSSXSSSSSS/" \
                             "////////////////////////////////////////////////////////////"

    def load(self, level):
        """Loads in level based on ASCII values"""
        count_x = 0
        count_y = 0
        if level == 1:
            ascii_map = self.level_one_key
        elif level == 2:
            ascii_map = self.level_two_key
        elif level == 3:
            ascii_map = self.level_three_key

        for i in ascii_map:
            if i == '/':
                self.terrain_objects.append(Terrain(count_x, count_y))
            elif i == 'S':
                pass
            elif i == 'X':
                self.enemy_manager.spawn(count_x, count_y)
            elif i == 'G':
                # self.objects.append(Gun(count_x, count_y, self.surface)
                pass
            count_x += SIZE_BLOCK
            if count_x == SIZE_SCREEN_X:
                count_x = 0
                count_y += SIZE_BLOCK
            if count_y == SIZE_SCREEN_Y:
                break

    def shift(self, speed):
        """Updates map coordinates"""
        for terrain in self.terrain_objects:
            terrain.x -= speed
        self.enemy_manager.level_shift(speed)
        self.counter += speed
        if self.counter == 1600:
            self.end_of_level = True
            
    def check_collisions(self, rect_object, is_bullet):
        """Checks collisions with terrain"""
        if not is_bullet:
            hit = [0, 0]
            for terrain in self.terrain_objects:
                if self.collide.check_collision(rect_object, terrain):
                    hit = self.collide.check_hit_direction(rect_object, terrain)
                    self.collide.handleBoxHit(rect_object, terrain, hit)
            return hit
        else:
            flag = False
            for terrain in self.terrain_objects:
                if self.collide.check_collision(rect_object, terrain):
                    flag = True
            return flag
                
    def draw_terrain(self):
        for terrain in self.terrain_objects:
            pygame.draw.rect(self.surface, COLOR_TERRAIN, terrain, 0)
            self.surface.blit(terrain.tile, (terrain.x, terrain.y))
class LevelLoader:
    """Handles loading in maps"""
    def __init__(self, surface, enemy_manager):
        """Constructor"""
        self.surface = surface
        self.enemy_manager = enemy_manager
        self.terrain_objects = []
        self.gun_objects = []
        self.enemies = []
        self.end_of_level = False
        self.collide_flag = False
        self.counter = 0
        self.collide = CollisionManager()

        # Level ASCII keys
        self.level_one_key = "////////////////////////////////////////////////////////////" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "///////////////////////////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSSSSSSSSSSSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSSSSXSSSSSSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SXSSSSSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "//////SSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSS///////SSSSSS/////SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/" \
                             "/SSSSSSSS///////SSSSSSSSSSSSSSSS///SSSSS//SSSSS////SSSSSSSS/" \
                             "/SSSSSS//SSSSSSSSSSSSSSSXSSSSSSSSXSSSSSSSXSSSSSSXSSSXSSSSSS/" \
                             "////////////////////////////////////////////////////////////"

    def load(self, level):
        """Loads in level based on ASCII values"""
        count_x = 0
        count_y = 0
        if level == 1:
            ascii_map = self.level_one_key
        elif level == 2:
            ascii_map = self.level_two_key
        elif level == 3:
            ascii_map = self.level_three_key

        for i in ascii_map:
            if i == '/':
                self.terrain_objects.append(Terrain(count_x, count_y))
            elif i == 'S':
                pass
            elif i == 'X':
                self.enemy_manager.spawn(count_x, count_y)
            elif i == 'G':
                # self.objects.append(Gun(count_x, count_y, self.surface)
                pass
            count_x += SIZE_BLOCK
            if count_x == SIZE_SCREEN_X:
                count_x = 0
                count_y += SIZE_BLOCK
            if count_y == SIZE_SCREEN_Y:
                break

    def shift(self, speed):
        """Updates map coordinates"""
        for terrain in self.terrain_objects:
            terrain.x -= speed
        self.enemy_manager.level_shift(speed)
        self.counter += speed
        if self.counter == 1600:
            self.end_of_level = True

    def check_collisions(self, rect_object, is_bullet):
        """Checks collisions with terrain"""
        if not is_bullet:
            hit = [0, 0]
            for terrain in self.terrain_objects:
                if self.collide.check_collision(rect_object, terrain):
                    hit = self.collide.check_hit_direction(
                        rect_object, terrain)
                    self.collide.handleBoxHit(rect_object, terrain, hit)
            return hit
        else:
            flag = False
            for terrain in self.terrain_objects:
                if self.collide.check_collision(rect_object, terrain):
                    flag = True
            return flag

    def draw_terrain(self):
        for terrain in self.terrain_objects:
            pygame.draw.rect(self.surface, COLOR_TERRAIN, terrain, 0)
            self.surface.blit(terrain.tile, (terrain.x, terrain.y))