import pyxel
import random
import math

# Configuration de la fenêtre de jeu
LARGEUR_FENETRE = 160
HAUTEUR_FENETRE = 120
TAILLE_BALLE = 6
TAILLE_VAISSEAU = 8
LASER_VITESSE = 2

def creer_vaisseau():
    return [LARGEUR_FENETRE // 2, HAUTEUR_FENETRE // 2]

def mettre_a_jour_vaisseau(vaisseau):
    deplacement = 2
    if pyxel.btn(pyxel.KEY_LEFT) and vaisseau[0] > 0:
        vaisseau[0] -= deplacement
    if pyxel.btn(pyxel.KEY_RIGHT) and vaisseau[0] < LARGEUR_FENETRE - TAILLE_VAISSEAU:
        vaisseau[0] += deplacement
    if pyxel.btn(pyxel.KEY_UP) and vaisseau[1] > 0:
        vaisseau[1] -= deplacement
    if pyxel.btn(pyxel.KEY_DOWN) and vaisseau[1] < HAUTEUR_FENETRE - TAILLE_VAISSEAU:
        vaisseau[1] += deplacement
    return vaisseau

def creer_balle():
    x = random.randint(0, LARGEUR_FENETRE - TAILLE_BALLE)
    angle = random.uniform(0, 2 * math.pi)
    return [x, 0, angle, 0]

def mettre_a_jour_balle(balle):
    x, y, angle, rebonds = balle
    deplacement_x = 2 * math.cos(angle)
    deplacement_y = 2 * math.sin(angle)
    x += deplacement_x
    y += deplacement_y

    if x <= 0 or x >= LARGEUR_FENETRE - TAILLE_BALLE:
        angle = math.pi - angle
        rebonds += 1
    if y <= 0 or y >= HAUTEUR_FENETRE - TAILLE_BALLE:
        angle = -angle
        rebonds += 1

    if rebonds >= 4:
        return None

    return [x, y, angle, rebonds]

def gerer_collisions_balles(balles):
    for i in range(len(balles)):
        for j in range(i + 1, len(balles)):
            bx1, by1, _, _ = balles[i]
            bx2, by2, _, _ = balles[j]
            dist = math.sqrt((bx2 - bx1) ** 2 + (by2 - by1) ** 2)
            if dist < TAILLE_BALLE:
                balles[i][2], balles[j][2] = balles[j][2], balles[i][2]

def mettre_a_jour_balles(balles, balles_disparues):
    nouvelles_balles = []
    for balle in balles:
        balle_mise_a_jour = mettre_a_jour_balle(balle)
        if balle_mise_a_jour is not None:
            nouvelles_balles.append(balle_mise_a_jour)
        else:
            balles_disparues.append(1)
    gerer_collisions_balles(nouvelles_balles)
    return nouvelles_balles

def verifier_collision(vaisseau, balles):
    vaisseau_x, vaisseau_y = vaisseau
    for balle in balles:
        balle_x, balle_y, _, _ = balle
        if (vaisseau_x < balle_x + TAILLE_BALLE and vaisseau_x + TAILLE_VAISSEAU > balle_x and
            vaisseau_y < balle_y + TAILLE_BALLE and vaisseau_y + TAILLE_VAISSEAU > balle_y):
            return True
    return False

def creer_laser():
    return [LARGEUR_FENETRE, random.randint(0, HAUTEUR_FENETRE - TAILLE_VAISSEAU)]

def mettre_a_jour_lasers(lasers):
    for idx, laser in enumerate(lasers):
        lasers[idx][0] -= LASER_VITESSE

def dessiner_lasers(lasers):
    for laser in lasers:
        # Dessiner le faisceau principal
        pyxel.line(laser[0], laser[1], laser[0] - 20, laser[1], pyxel.COLOR_YELLOW)
        # Dessiner l'effet feu avec des petits cercles de couleur rouge
        for i in range(3):
            pyxel.circ(laser[0] - 20 - i * 3, laser[1], 1 + i, pyxel.COLOR_RED)

def verifier_collision_laser_vaisseau(vaisseau, lasers):
    vaisseau_x, vaisseau_y = vaisseau
    for laser in lasers:
        if (laser[0] >= vaisseau_x and laser[0] <= vaisseau_x + TAILLE_VAISSEAU and
            laser[1] >= vaisseau_y and laser[1] <= vaisseau_y + TAILLE_VAISSEAU):
            return True
    return False

# Ajout d'un compteur d'esquive de justesse
compteur_esquive = 0

def verifier_esquive(vaisseau, balles):
    global compteur_esquive
    vaisseau_x, vaisseau_y = vaisseau
    for balle in balles:
        balle_x, balle_y, _, _ = balle
        dist = abs(vaisseau_x - balle_x) + abs(vaisseau_y - balle_y)
        if dist < 5:  # Ajustez ce nombre selon votre préférence pour ce qui est considéré comme "juste"
            compteur_esquive += 1
            return True
    return False

def mise_a_jour():
    global vaisseau, balles, balles_disparues, game_over, lasers
    if game_over:
        if pyxel.btn(pyxel.KEY_R):
            game_over = False
            vaisseau = creer_vaisseau()
            balles = []
            balles_disparues = []  # Réinitialisation de balles_disparues ici
            lasers = []
            # Réinitialiser le compteur d'esquive
            global compteur_esquive
            compteur_esquive = 0
        return

    if verifier_collision(vaisseau, balles) or verifier_collision_laser_vaisseau(vaisseau, lasers):
        game_over = True
        return

    vaisseau = mettre_a_jour_vaisseau(vaisseau)
    if pyxel.frame_count % 30 == 0:
        balles.append(creer_balle())
        lasers.append(creer_laser())
    balles = mettre_a_jour_balles(balles, balles_disparues)
    if balles_disparues