import pygame

##############
# CONSTANTES #
##############
# Choix des couleurs RGB
NOIR = (0, 0, 0)
BLANC = (255, 255, 255)
ROUGE = (255, 0, 0)
VERT = (0, 255, 0)
BLEU = (0, 0, 255)

# Constantes de la fenêtre de jeu
SCREEN_LARG = 600 # Largeur de la fenêtre de jeu
SCREEN_HAUT = 400 # Hauteur de la fenêtre de jeu

# Constantes du Jeu
RAQU_HAUT = 50 # Hauteur d'une raquette
RAQU_LARG = 10 # Largeur d'une raquette
DIST_MUR = 20 # Distance du mur au bord d'une raquette
BALL_RAY = 10 # Rayon de la balle

##################
# INITIALISATION #
##################
# Initialisation de l'écran de jeu
pygame.init()

# Initialisation de la fenêtre de jeu
screen = pygame.display.set_mode((SCREEN_LARG, SCREEN_HAUT))
pygame.display.set_caption("PING")

# Choix de la police de caractères
police = pygame.font.SysFont("Arial", 25)

# Gestion du rafraichissement de l'écran
clock = pygame.time.Clock()

# Initialisation de la fréquence sur 30 FPS
clock.tick(30)

# Cacher le pointeur de la souris
pygame.mouse.set_visible(0)

#############
# FONCTIONS #
#############
# Fonction permettant de dessiner une raquette
def dessiner_raquette(x, y):
    rectangle = (x, y, RAQU_LARG, RAQU_HAUT)
    pygame.draw.rect(screen, BLANC, rectangle, 0)

# Fonction permettant de dessiner une balle
def dessiner_balle(x,y):
    centre = (x, y)
    rayon = BALL_RAY
    pygame.draw.circle(screen, BLANC, centre, rayon, 0)

####################
# VARIABLES D'ETAT #
####################
# Coordonnées de la raquette gauche
raqu_gauche_x = DIST_MUR # x coin supérieur gauche
raqu_gauche_y = SCREEN_HAUT // 2 - RAQU_HAUT // 2 # y coin supérieur gauche

# Coordonnées de la raquette droite
raqu_droite_x = SCREEN_LARG - DIST_MUR - RAQU_LARG # x coin supérieur gauche
raqu_droite_y = SCREEN_HAUT // 2 - RAQU_HAUT // 2 # y coin supérieur gauche

# Coordoannées de la balle
ball_x = SCREEN_LARG // 2 # x centre de la balle
ball_y = SCREEN_HAUT // 2 # y centre de la balle

# Vitesse de la balle
ball_vitesse_x = -1 # vitesse horizontale de la balle
ball_vitesse_y = -1 # vitesse verticale de la balle

# Score
score_joueur1 = 0
score_joueur2 = 0

#######
# JEU #
#######
# Le jeu continue tant que l'utilisateur ne ferme pas la fenêtre
termine = False

# Boucle principale de jeu
while not termine:
    # Garder la fréquence sur 30 FPS
    clock.tick(30)
    
    ##############
    # EVENEMENTS #
    ##############
    # détecte le clic sur le bouton close de la fenêtre
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            termine = True

    # Récupère la liste des touches claviers appuyeées sous la forme d'une liste de booléens
    KeysPressed = pygame.key.get_pressed()

    ###########
    # LOGIQUE #
    ###########
    # Déplacement de la raquette gauche
    if KeysPressed[pygame.K_a]: # touche a vers le haut
        raqu_gauche_y -= 2
        # Gestion débordement haut
        # TODO
        # TODO
        # TODO

    if KeysPressed[pygame.K_q]: # touche q
        raqu_gauche_y += 2
        # Gestion débordement bas
        # TODO
        # TODO
        # TODO

        
    # Déplacement de la raquette droite
    # Gestion des débordements haut et bas
    # TODO
    # TODO
    # TODO

    # Déplacement de la balle
    ball_x += ball_vitesse_x
    ball_y += ball_vitesse_y

   
    # Collision entre la balle et la raquette gauche
    if ball_x  <  DIST_MUR + RAQU_LARG + BALL_RAY:
        if raqu_gauche_y < ball_y  <  raqu_gauche_y + RAQU_HAUT:
            ball_vitesse_x *= -1

    # Collision entre la balle et la raquette droite
    # TODO
    # TODO
    # TODO

    # Collision entre la balle et le plafond
    if ball_y < BALL_RAY:
        ball_vitesse_y *= -1

    # Collision entre la balle et le sol
    # TODO
    # TODO
    # TODO

    # Collision entre la balle et le bord gauche de la fenêtre
    # Evolution du score
    # TODO
    # TODO
    # TODO

    # Collision entre la balle et le bord droit de la fenêtre
    # Evolution du score
    # TODO
    # TODO
    # TODO
    
    #############
    # AFFICHAGE #
    #############
    # Dessiner le fond
    screen.fill(NOIR)
   
    # Dessiner la raquette gauche
    dessiner_raquette(raqu_gauche_x, raqu_gauche_y)
   
    # Dessiner la raquette droite
    dessiner_raquette(raqu_droite_x, raqu_droite_y)
   
    # Dessiner la balle
    dessiner_balle(ball_x, ball_y)

    # Définir le texte à afficher
    texte = str(score_joueur1) + " : " + str(score_joueur2)
    # Afficher le gagnant
    # TODO
    # TODO
    # TODO
    
    # Dessiner le texte dans une zone à part
    zone = police.render(texte, True, VERT)
    # Afficher la zone dans la fenetre de jeu
    screen.blit(zone, (280, 10))

    # Basculer l'image dessinée à l'écran
    pygame.display.flip()


##############
# FIN DU JEU #
##############
# Fermer la fenêtre
pygame.quit()
