import pygame
from time import sleep

from pygame.sprite import Sprite

pygame.init()

class Camera:
        def __init__(self, player, size=(400, 300)):
            self.player = player
            self.center = pygame.display.get_surface().get_rect().center
            self.size = size
            self.player_size = self.player.rect.size
            self.speed_x = 0
            self.speed_y = 0

        def update(self, dt, sprites):
            x_move = abs(self.player.rect.centerx - self.center[0]) > self.size[0] // 2
            y_move = abs(self.player.rect.centery - self.center[1]) > self.size[1] // 2
            if x_move or y_move:
                for sprite in sprites:
                    if x_move:
                        self.speed_x = (self.player.rect.centerx - self.center[0]) * 2 * dt
                        sprite.rect.x -= self.speed_x
                    if y_move:
                        self.speed_y = (self.player.rect.centery - self.center[1]) * 2 * dt
                        sprite.rect.y -= self.speed_y



class Wall(pygame.sprite.Sprite):
    def __init__(self, size, pos) -> None:
        super().__init__()
        self.image = pygame.surface.Surface(size)
        self.image.fill("red")
        self.rect = self.image.get_rect(center=pos)
        
class Floor(pygame.sprite.Sprite):
    def __init__(self, size, pos) -> None:
        super().__init__()
       

def create_floor(file_name):
    floor = []
    with open (file_name) as f:
        lines = f.readlines()
        for i, line in enumerate(lines[::2]):
            if floor == "#":
                floor.append(Floor((30,30), (30 + 30*i)))
    return floor


def create_walls(file_name):
    walls = []
    with open(file_name) as f:
        lines = f.readlines()
        for i, line in enumerate(lines[::2]):
            for j, floor in enumerate(line[1::2]):
                if floor == "|":
                    walls.append(Wall((5, 30), (15 + 30*j, 30*i)))
        for i, line in enumerate(lines[1::2]):
            for j, floor in enumerate(line[::2]):
                if floor == "-":
                    walls.append(Wall((30, 5), (30*j, 15 + 30*i)))

    return walls
              
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.right = True
        self.move = True
        self.player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)
        self.dt = 0
        self.keys = pygame.key.get_pressed()
        self.player_right = pygame.transform.scale(pygame.image.load("Sprites/Idle/Player_right.png").convert_alpha(), (35, 40)),
        self.player_run_right_1 = pygame.transform.scale(pygame.image.load("Sprites/Running/Player_run_right_1.png").convert_alpha(), (35, 40)),
        self.player_run_right_2 = pygame.transform.scale(pygame.image.load("Sprites/Running/Player_run_right_2.png").convert_alpha(), (35, 40)),
        self.player_run_right_3 = pygame.transform.scale(pygame.image.load("Sprites/Running/Player_run_right_3.png").convert_alpha(), (35, 40)),
        self.player_run_right_4 = pygame.transform.scale(pygame.image.load("Sprites/Running/Player_run_right_4.png").convert_alpha(), (35, 40)),
        self.player_run_right_5 = pygame.transform.scale(pygame.image.load("Sprites/Running/Player_run_right_5.png").convert_alpha(), (35, 40)),
        self.player_run_right_6 = pygame.transform.scale(pygame.image.load("Sprites/Running/Player_run_right_6.png").convert_alpha(), (35, 40))

        self.player_left = pygame.transform.scale(pygame.image.load("Sprites/Idle/Player_left.png").convert_alpha(), (35, 40))




    def movement(self):
        if self.keys[pygame.K_w]:
            self.player_pos.y -= 200 * dt
        if self.keys[pygame.K_s]:
            self.player_pos.y += 200 * dt
        if self.keys[pygame.K_a]:
            self.player_pos.x -= 200 * dt
            screen.blit(self.player_left, (self.player_pos.x, self.player_pos.y))
            right = False
    
        if self.keys[pygame.K_d]:
            self.player_pos.x += 200 * dt
            screen.blit(self.player_right, (self.player_pos.x, self.player_pos.y))
            self.right = True
            self.move = True
        else:
            move = False  
            

    def sprites(self):      
        if self.right == True:
            screen.blit(self.player_right, (self.player_pos.x, self.player_pos.y))
        else:
            screen.blit(self.player_left, (self.player_pos.x, self.player_pos.y))

        while self.move == True:
            screen.blit(self.player_run_right_1, (self.player_pos.x, self.player_pos.y))
            sleep(0.05)
            screen.blit(self.player_run_right_2, (self.player_pos.x, self.player_pos.y))
            sleep(0.05)
            screen.blit(self.player_run_right_3, (self.player_pos.x, self.player_pos.y))
            sleep(0.05)
            screen.blit(self.player_run_right_4, (self.player_pos.x, self.player_pos.y))
            sleep(0.05)
            screen.blit(self.player_run_right_5, (self.player_pos.x, self.player_pos.y))
            sleep(0.05)
            screen.blit(self.player_run_right_6, (self.player_pos.x, self.player_pos.y))
            sleep(0.05)








screen = pygame.display.set_mode((1920, 1015))
pygame.display.set_caption("Game_name")

clock = pygame.time.Clock()




floor_image = pygame.transform.scale(pygame.image.load("Floor.png").convert_alpha(), (30, 30))





running = True

wall_list = create_walls("lvl.txt")
for wall in wall_list:
    print(f'{wall.rect.size})x = {wall.rect.x}; y = {wall.rect.y}')
walls = pygame.sprite.Group(*wall_list)

floor_list = create_floor("lvl.txt")
for floor in floor_list:
    print(f'{floor.rect.size})x = {floor.rect.x}; y = {floor.rect.y}')
floor = pygame.sprite.Group(*floor_list)


player = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill("cyan")
    for y in range(10,20):
        for x in range(26,38):
            screen.blit(floor_image, (30*x, 30*y))
    
    all_sprites.draw(screen)
    
    
    walls.draw(screen)
    pygame.display.flip()

    dt = clock.tick(60)/1000
    
    floor.draw(screen)




    





    

pygame.quit()