import pygame
import sys
import random
import time

# Initialize PyGame
pygame.init()
pygame.font.init()

# Set up the game window
screen_width = 1920
screen_height = 1080
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Robin Huysmans 5ICW")

# Set the frame rate
clock = pygame.time.Clock()

# Player settings
player_width = 100
player_height = 120
player_x = screen_width // 2 - player_width // 2
player_y = screen_height - player_height - 10
player_speed = 10
player_rad = 50

# Bullet settings
bullet_width = 15
bullet_height = 15
bullet_speed = 15
bullets = []

# Enemy settings
enemy_width = 100
enemy_height = 120
enemy_speed = 5
enemies = []
aantal_enemies = 0

# Spawn an enemy every 2 seconds
enemy_timer = 0
enemy_spawn_time = 2000


font = pygame.font.Font(None, 100)
score = 1
shots = 1
timestart = time.time()

color1 = 0
color2 = 128
color3 = 255
color32 = 255
color33 = 255


# Collision detection function
def check_collision(rect1, rect2):
    return pygame.Rect(rect1).colliderect(pygame.Rect(rect2))

# Main game loop
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                bullet_x = player_x  - bullet_width // 2
                bullet_y = player_y + (player_rad*2)
                bullets.append([bullet_x, bullet_y,'up'])
                shots+=1
            if event.key == pygame.K_DOWN:
                bullet_x = player_x  - bullet_width // 2
                bullet_y = player_y + (player_rad*2)
                bullets.append([bullet_x, bullet_y,'down'])
                shots+=1
            if event.key == pygame.K_RIGHT:
                bullet_x = player_x  - bullet_width // 2
                bullet_y = player_y + (player_rad*2)
                bullets.append([bullet_x, bullet_y,'right'])
                shots+=1
            if event.key == pygame.K_LEFT:
                bullet_x = player_x  - bullet_width // 2
                bullet_y = player_y + (player_rad*2)
                bullets.append([bullet_x, bullet_y,'left'])
                shots+=1
            if event.key == pygame.K_a:
                if color1 == 0 and color2 == 128 and color3 == 255:
                    color1 = random.randint(0,255)
                    color2 = random.randint(0,255)
                    color3 = random.randint(0,255)
                    color32 = random.randint(0,255)
                    color33 = random.randint(0,255)
                else :
                    color1 = 0
                    color2 = 128
                    color3 = 255
                    color32 = 255
                    color33 = 255
                
                


    # Handle player movement
    keys = pygame.key.get_pressed()
    if keys[pygame.K_q]:
        if player_x < 0:
            player_x = screen_width
        player_x -= player_speed
    if keys[pygame.K_d]:
        if player_x > screen_width - (player_rad*2):
            player_x = 0
        player_x += player_speed
    if keys[pygame.K_z]:
        if player_y < 0:
            player_y = screen_height
        player_y -= player_speed
    if keys[pygame.K_s] :
        if player_y > screen_height - (player_rad*2):
            player_y = 0
        player_y += player_speed

    # Update bullet positions
    for bullet in bullets:
        if bullet[2] == 'up':
            bullet[1] -= bullet_speed
        if bullet[2] == 'down':
            bullet[1] += bullet_speed
        if bullet[2] == 'left':
            bullet[0] -= bullet_speed
        if bullet[2] == 'right':
            bullet[0] += bullet_speed
    bullets = [bullet for bullet in bullets if bullet[1] > 0]

    # Update enemy positions and spawn new ones
    current_time = pygame.time.get_ticks()
    if current_time - enemy_timer > enemy_spawn_time:
        enemy_x = random.randint(0, screen_width - enemy_width)
        enemy_y = -enemy_height
        enemies.append([enemy_x, enemy_y, random.randint(4,10)])
        enemy_timer = current_time
        enemy_spawn_time = random.randint(800,3000)
        aantal_enemies += 1

    for enemy in enemies:
        enemy[1] += enemy[2]

    # Check for collisions
    for bullet in bullets[:]:
        for enemy in enemies[:]:
            if check_collision((bullet[0], bullet[1], bullet_width, bullet_height),
                               (enemy[0], enemy[1], enemy_width, enemy_height)):
                bullets.remove(bullet)
                enemies.remove(enemy)
                score+= 1
                break

    # Remove enemies that are off the screen
    enemies = [enemy for enemy in enemies if enemy[1] < screen_height]

    # Fill the screen with black
    screen.fill((color3, color32, color33))

    # Draw the player
    pygame.draw.circle(screen, (color1, color3, color2), (player_x, player_y), player_rad)

    # Draw the bullets
    for bullet in bullets:
        pygame.draw.rect(screen, (color3, color3, color1), (bullet[0], bullet[1], bullet_width, bullet_height))

    # Draw the enemies
    for enemy in enemies:
        pygame.draw.rect(screen, (color1, color1, color1), (enemy[0], enemy[1], enemy_width, enemy_height))


    screen.blit((font.render('score ' + str(score), True, (color1, color1, color1))),(0,0))
    screen.blit((font.render('shots ' + str(shots), True, (color1, color1, color1))),(0,60))
    screen.blit((font.render('enemies ' + str(aantal_enemies), True, (color1, color1, color1))),(0,120))
    screen.blit((font.render('accuracy ' + str(score/shots), True, (color1, color1, color1))),(screen_width-450,0))
    screen.blit((font.render('time ' + str(round(time.time()-timestart)), True, (color1, color1, color1))),(screen_width-235,60))
    # Update the display
    pygame.display.flip()

    # Cap the frame rate at 60 FPS
    clock.tick(60)
