import random
import pygame
import pygame.font

from settings import GameSettings
from map import Map
from entity import Enemy, Player
from projectiles import Projectiles
from camera import Camera

class Game:
    def __init__(self):
        self.settings = GameSettings()
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption(self.settings.caption)

        self.clock = pygame.time.Clock()

        self.map = Map(self, 0, 0)
        player_spawn_block = self.map.player_spawn
        offset = [
            (self.settings.screen_width // 2) - player_spawn_block.x - (self.settings.block_size // 2),
            (self.settings.screen_height // 2) - player_spawn_block.y - (self.settings.block_size // 2)
        ]
        self.map.change_coords(offset[0], offset[1])

        self.enemies = pygame.sprite.Group()

        self.projectiles = Projectiles(self)
        d = (self.settings.block_size - self.settings.entity_size) // 2
        self.player = Player(self, self.map.player_spawn.x + d, self.map.player_spawn.y + d)
        self.camera = Camera(self)
        self.score = 0

    
    def run(self):
        while self.settings.running:
            #FPS control
            self.clock.tick(self.settings.fps)

            #Events
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.settings.running = False
            
            self.camera.update()
            self.enemies.update()

            #Spawn enemies
            if self.settings.enemy_spawn_rev < self.settings.enemy_spawn_rev_thresh:
                self.settings.enemy_spawn_rev -= self.settings.enemy_spawn_rev_delta
            
            if random.randint(1, self.settings.enemy_spawn_rev) == 1:
                self.spawn_enemy()

            #Render
            self.screen.fill((0, 0, 0))
            self.map.update()
            #print(map)
            self.player.update()
            self.enemies.draw(self.screen)
            self.projectiles.update()
            self.draw_score()

            pygame.display.flip()
        
        return self.score
    
    def spawn_enemy(self):
        es = random.choice(self.map.enemy_spawns)
        self.enemies.add(Enemy(self, es.x, es.y))
    
    def draw_score(self):
        fnt = pygame.font.SysFont("calibri", 40, True)
        score = fnt.render("Score: " + str(self.score), True, (255, 255, 255), (0, 0, 0))
        self.screen.blit(score, (0, 0))