# code
import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, color, size, pos, walls):
        super().__init__()
        self.image = pygame.Surface(size)
        self.image.fill(color)
        self.rect = self.image.get_rect(center=pos)
        self.foot_size = 15
        self.dt = 0
        self.weight = 2500
        self.speed_x = 0
        self.max_speed_x = 700
        self.speed_y = 0
        self.max_speed_y = 1500
        self.is_jumping = False
        self.jumping_time = 0
        self.walls = walls

    def gravity(self, dt):
        self.speed_y += self.weight * dt
        if self.speed_y > self.max_speed_y:
            self.speed_y = self.max_speed_y
        self.rect.y += self.speed_y * dt

    def jump(self):
        if not self.is_jumping:
            self.is_jumping = True
            self.jumping_time = 0
            self.speed_y = -1500

    def move_x(self, dt):
        if abs(self.speed_x) > self.max_speed_x:
            self.speed_x = self.max_speed_x * (self.speed_x / abs(self.speed_x))

        self.rect.x += self.speed_x * dt

    def collision(self):
        collisions = pygame.sprite.spritecollide(self, self.walls, False)
        if collisions:
            for wall in collisions:
                if abs(self.rect.bottom - wall.rect.top) < self.foot_size:
                    self.rect.bottom = wall.rect.top
                    self.speed_y = 0
                    self.jumping_time = 0
                    self.is_jumping = False

                elif abs(self.rect.top - wall.rect.bottom) < self.foot_size:
                    self.rect.top = wall.rect.bottom
                    self.speed_y = 0

                elif abs(self.rect.right - wall.rect.left) < self.foot_size:
                    self.rect.right = wall.rect.left
                    self.speed_x = 0
                elif abs(self.rect.left - wall.rect.right) < self.foot_size:
                    self.rect.left = wall.rect.right
                    self.speed_x = 0

    def player_input(self, dt):
        keys = pygame.key.get_pressed()
        move_direction = 0
        if keys[pygame.K_w]:
            self.jump()
        elif keys[pygame.K_SPACE]:
            self.jump()
        if keys[pygame.K_a]:
            self.speed_x -= self.max_speed_x * 3 * dt
            move_direction = -1
        if keys[pygame.K_d]:
            self.speed_x += self.max_speed_x * 3 * dt
            move_direction = 1 + move_direction
        if (move_direction == 0 or (self.speed_x * move_direction < 0)) and not self.is_jumping:
            self.speed_x -= self.speed_x * 5 * dt
        elif self.is_jumping:
            self.speed_x -= self.speed_x * dt
        if abs(self.speed_x) < 5:
            self.speed_x = 0

    def update(self, dt):
        self.player_input(dt)
        self.gravity(dt)
        self.move_x(dt)
        self.collision()


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, color, size, pos):
        super().__init__()
        self.image = pygame.Surface(size)
        self.image.fill(color)
        self.rect = self.image.get_rect(center=pos)

class Button:
    def __init__(self, up_image_path, over_image_path, position):
        self.up_image = pygame.image.load(up_image_path)
        self.over_image = pygame.image.load(over_image_path)
        self.image = self.up_image
        self.rect = self.image.get_rect(topleft=position)
        self.mask = pygame.mask.from_surface(self.image)

    def is_hovered(self, mouse_pos):
        return self.rect.collidepoint(mouse_pos) and self.mask.get_at((mouse_pos[0] - self.rect.x, mouse_pos[1] - self.rect.y))

    def update(self, mouse_pos):
        if self.is_hovered(mouse_pos):
            self.image = self.over_image
        else:
            self.image = self.up_image

pygame.init()

FPS = 60
BACKGROUND_IMAGE = "background.png"
FONT, SIZE = 'comicsansms', 14

programIcon = pygame.image.load('icon.png')
pygame.display.set_icon(programIcon)
pygame.display.set_caption('Hell Circus')
screen_info = pygame.display.Info()
screen = pygame.display.set_mode((1920, 1080), pygame.FULLSCREEN)
transparent = (255, 0, 128)
clock = pygame.time.Clock()
hwnd = pygame.display.get_wm_info()["window"]

font = pygame.font.SysFont(FONT, SIZE)