import sys
sys.dont_write_bytecode = True
import pygame
import space
import sys

# Paramètres du jeu
WIDTH = 800
HEIGHT = 600
FPS = 60

# Lancement des modules de pygame
pygame.init()
clock = pygame.time.Clock()

# Création de la fenêtre
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Space Invaders")

# Instantiation de la classe jeu
jeu = space.Jeu(screen, WIDTH, HEIGHT, FPS)

### BOUCLE DE JEU  ###
while True :
    # Fond de la fenêtre
    if (jeu.scene not in ['transition', 'ending', 'free_death', 'campaign_death']) and (jeu.bg_stop is False):
        jeu.screen.blit(jeu.background(), (0, 0))

    ### Gestion des événements  ###
    for event in pygame.event.get():
        # Fermeture de la fenêtre
        if event.type == pygame.QUIT:
            sys.exit()
        # Gestion du clavier
        elif event.type == pygame.KEYDOWN:
            if jeu.scene in ['campaign', 'free']:
                if event.key == pygame.K_LEFT : # Flèche gauche
                    jeu.player.sens = "gauche"
                if event.key == pygame.K_RIGHT: # Flèche droite
                    jeu.player.sens = "droite"
                if event.key == pygame.K_SPACE: # Touche espace (pour tirer)
                    if jeu.tir.etat == 'chargee':
                        pygame.mixer.Sound.play(pygame.mixer.Sound(jeu.assets['sounds_balle']))
                    jeu.tir.etat = "tiree"
                if event.key == pygame.K_z: # Touche Z (tornado)
                    if jeu.world >= 2:
                        jeu.player.tornado.tirer()
                if event.key == pygame.K_e: # Touche E (teleportation)
                    if jeu.world >= 3:
                        jeu.player.teleportation.teleport()
                if event.key == pygame.K_q: # Touche Q (heal)
                    if jeu.world >= 4:
                        jeu.player.heal.active()
                if event.key == pygame.K_s: # Touche S (wave)
                    if jeu.world >= 5:
                        jeu.player.wave.tirer()
                if event.key == pygame.K_d: # Touche d (jammer)
                    if jeu.world >= 6:
                        jeu.player.jammer.active()
                if event.key == pygame.K_f: # Touche F (laser)
                    if jeu.world >= 7:
                        jeu.player.laser.tirer()
                if event.key == pygame.K_ESCAPE: # Menu In_Game (Echap)
                    jeu.ingame_menu()
        # Gestion de la souris
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if jeu.scene == 'home':
                if 9.5 * WIDTH / 100 <= event.pos[0] <= 42.4 * WIDTH / 100 and 44.3 * HEIGHT / 100 <= event.pos[1] <= 49.5 * HEIGHT / 100: # Lancer une campagne
                    jeu.campaign()
                if 9.5 * WIDTH / 100 <= event.pos[0] <= 34 * WIDTH / 100 and 54.17 * HEIGHT / 100 <= event.pos[1] <= 59.17 * HEIGHT / 100: # Choix du niveau
                    jeu.scene = 'levels'
                if 9.5 * WIDTH / 100 <= event.pos[0] <= 26.75 * WIDTH / 100 and 64.17 * HEIGHT / 100 <= event.pos[1] <= 69.17 * HEIGHT / 100: # Mode libre
                    jeu.free()
                if 9.5 * WIDTH / 100 <= event.pos[0] <= 20.75 * WIDTH / 100 and 73.83 * HEIGHT / 100 <= event.pos[1] <= 79 * HEIGHT / 100: # Quitter
                    sys.exit()
            elif jeu.scene == 'levels':
                if 120 <= event.pos[0] <= 180 and 120 <= event.pos[1] <= 150: # Accueil
                    jeu.scene = 'home'
                if 140 <= event.pos[0] <= 265 and 200 <= event.pos[1] <= 270: # Monde 1
                    jeu.campaign(1)
                if 270 <= event.pos[0] <= 395 and 200 <= event.pos[1] <= 270: # Monde 2
                    jeu.campaign(2)
                if 400 <= event.pos[0] <= 525 and 200 <= event.pos[1] <= 270: # Monde 3
                    jeu.campaign(3)
                if 530 <= event.pos[0] <= 655 and 200 <= event.pos[1] <= 270: # Monde 4
                    jeu.campaign(4)
                if 140 <= event.pos[0] <= 265 and 330 <= event.pos[1] <= 400: # Monde 5
                    jeu.campaign(5)
                if 270 <= event.pos[0] <= 395 and 330 <= event.pos[1] <= 400: # Monde 6
                    jeu.campaign(6)
                if 400 <= event.pos[0] <= 525 and 330 <= event.pos[1] <= 400: # Monde 7
                    jeu.campaign(7)
                if 530 <= event.pos[0] <= 655 and 330 <= event.pos[1] <= 400: # Monde 8
                    jeu.campaign(8)
            elif jeu.scene == 'transition':
                if jeu.transition_step == 4:
                    if 42.5 * WIDTH / 100 <= event.pos[0] <= 57.5 * WIDTH / 100 and 63 * HEIGHT / 100 <= event.pos[1] <= 68.83 * HEIGHT / 100: # Continuer
                        jeu.transition_step += 1
            elif jeu.scene in ['campaign_menu', 'free_menu']:
                if 43.75 * WIDTH / 100 <= event.pos[0] <= 56.25 * WIDTH / 100 and 30 * HEIGHT / 100 <= event.pos[1] <= 35 * HEIGHT / 100: # Reprendre
                    if jeu.scene == 'campaign_menu':
                        jeu.scene = 'campaign'
                    elif jeu.scene == 'free_menu':
                        jeu.scene = 'free'
                if 45 * WIDTH / 100 <= event.pos[0] <= 56.25 * WIDTH / 100 and 45 * HEIGHT / 100 <= event.pos[1] <= 50 * HEIGHT / 100: # Accueil
                    jeu.scene = 'home'
                    pygame.mixer.music.fadeout(1500)
                if 45 * WIDTH / 100 <= event.pos[0] <= 56.25 * WIDTH / 100 and 60 * HEIGHT / 100 <= event.pos[1] <= 65 * HEIGHT / 100: # Quitter
                    sys.exit()
            elif jeu.scene in ['campaign_death', 'free_death']:
                if 42.5 * WIDTH / 100 <= event.pos[0] <= 57.5 * WIDTH / 100 and 66.67 * HEIGHT / 100 <= event.pos[1] <= 72.5 * HEIGHT / 100: # Continuer
                    jeu.scene = 'home'

    ### Actualisation de la scene ###
    if jeu.scene == 'home':
        jeu.home()
    elif jeu.scene == 'levels':
        jeu.levels()
    elif jeu.scene in ['campaign_menu', 'free_menu']:
        jeu.ingame_menu()
    elif jeu.scene in ['campaign', 'free']:
        # Gestion des ennemies
        if jeu.scene == 'campaign':
            jeu.world_campaign()
        else:
            jeu.world_free()
        # Gestion des cooldown
        jeu.player.cooldown()
        ## Score du joueur ##
        if jeu.scene == 'free':
            jeu.show_text(f'Score : {jeu.player.score}', (10, 10), 30)
        ## Placement des objets ##
        # Position
        jeu.player.deplacer()
        jeu.tir.bouger()
        ## Affichage ##
        # Mort
        for asset in space.Effect.listeEffects:
            asset.afficher()
        # Pouvoirs
        if jeu.world >= 2 and jeu.player.tornado.etat == 'tiree':
            jeu.player.tornado.bouger()
        if jeu.world >= 4 and jeu.player.heal.etat == 'actif':
            jeu.player.heal.afficher()
        if jeu.world >= 5 and jeu.player.wave.etat == 'tiree':
            jeu.player.wave.bouger()
        if jeu.world >= 6 and jeu.player.jammer.etat == 'actif':
            jeu.player.jammer.afficher()
        if jeu.world >= 7 and jeu.player.laser.etat == 'tiree':
            jeu.player.laser.afficher()
        # Boss
        if space.Boss.boss is not None:
            boss = space.Boss.boss
            boss.bouger()
            boss.tirer()
            boss.ability()
            jeu.screen.blit(boss.image, [boss.position, boss.hauteur])
        # Ennemis
        for ennemi in space.Ennemi.listeEnnemis:
            ennemi.avancer()
            ennemi.ability()
            jeu.screen.blit(ennemi.image, [ennemi.position, ennemi.hauteur])
        # Joueur
        jeu.screen.blit(jeu.tir.image, [jeu.tir.depart, jeu.tir.hauteur])
        jeu.screen.blit(jeu.player.image, [jeu.player.position, HEIGHT - 100])
        ## Gestions des collisions ##
        # Boss
        if space.Boss.boss is not None:
            boss = space.Boss.boss
            # Contact balle joueur
            if boss.name in ['Sérénité Astrale', 'Nébuleuse Éternelle', 'The Master']:
                if jeu.tir.toucher_healer(boss.pouvoir) is False:
                    if boss.image not in [jeu.assets['bosses_final_jammer'], jeu.assets['bosses_end_jammer']]:
                        if jeu.tir.toucher(boss):
                            jeu.player.marquer()
            elif boss.image not in [jeu.assets['bosses_nexus_anomalique_jammer'], jeu.assets['bosses_final_jammer'], jeu.assets['bosses_end_jammer']]:
                if jeu.tir.toucher(boss):
                    jeu.player.marquer()
            # Contact pouvoirs joueur
            if boss.image not in [jeu.assets['bosses_nexus_anomalique_jammer'], jeu.assets['bosses_final_jammer'], jeu.assets['bosses_end_jammer']]:
                if jeu.player.wave.toucher(boss):
                    jeu.player.marquer()
                if jeu.player.laser.toucher(boss):
                    jeu.player.marquer()
                jeu.player.tornado.toucher(boss)
        # Ennemis
        for ennemi in space.Ennemi.listeEnnemis:
            # Contact balle joueur
            if ennemi.type['name'] == 'healer_ship':
                if jeu.tir.toucher_healer(ennemi.pouvoir) is False:
                    if jeu.tir.toucher(ennemi):
                        ennemi.disparaitre()
                        jeu.player.marquer()
            elif ennemi.image != jeu.assets['enemies_jammer_ship_jammer']:
                if jeu.tir.toucher(ennemi):
                    ennemi.disparaitre()
                    jeu.player.marquer()
            # Contact pouvoirs joueur
            if ennemi.image != jeu.assets['enemies_jammer_ship_jammer']:
                if jeu.player.wave.toucher(ennemi):
                    ennemi.disparaitre()
                    jeu.player.marquer()
                if jeu.player.laser.toucher(ennemi):
                    ennemi.disparaitre()
                    jeu.player.marquer()
                jeu.player.tornado.toucher(ennemi)
        ## Interface ##
        jeu.interface()
    elif jeu.scene == 'transition':
        jeu.world_transition()
    elif jeu.scene == 'ending':
        jeu.ending()
    elif jeu.scene in ['campaign_death', 'free_death']:
        jeu.bg_stop = False
        # Fond noir
        rect = pygame.Rect(0, 0, jeu.width, jeu.height)
        pygame.draw.rect(jeu.screen, (0, 0, 0), rect)
        # Title
        jeu.show_text('GAME OVER!', (jeu.width / 2 - 90, jeu.height / 2 - 50), 40)
        # Score
        if jeu.scene == 'free_death':
            jeu.show_text(f'Score : {jeu.player.score}', (jeu.width / 2 - 50, jeu.height / 2), 30)
        # Continuer
        rect = pygame.Rect(jeu.width / 2 - 60, jeu.height - 200, 120, 35)
        pygame.draw.rect(jeu.screen, (255, 255, 255), rect, border_radius=12)
        jeu.show_text('Continuer', (jeu.width / 2 - 42, jeu.height - 190), 25, (0, 0, 0))
    pygame.display.update()
    # FPS
    clock.tick(FPS)
