###########################################################
# librairies
###########################################################
import pygame
from pygame.locals import *
import sys
import random
from constantes import *
import balle
import raquette

###########################################################
# fonctions utiles
###########################################################

""" 
	afficher un texte au centre de l'écran
	
	si la coordonnée y est égale à -1, on place le texte
	au milieu de la fenetred'affichage
	
	on peut également spécifier la couleur qui est l'orange
	par défaut
	
"""	
def affiche_texte_centre(texte, y=-1, couleur=None):
	if couleur == None:
		couleur = couleurs[ ORANGE_ROLAND_GARROS ]
	rendu = fonte.render(texte, True, couleur)
	rectangle = rendu.get_rect()
	if y == -1:
		rectangle.center = ((LARGEUR_FENETRE) / 2 , (HAUTEUR_FENETRE) / 2)
	else:
		rectangle.center = ((LARGEUR_FENETRE) / 2 , y)
	fenetre.blit(rendu, rectangle)


""" 
	afficher un texte au centre de l'écran en précisant
	les coordonnées x et y
	
	on peut également spécifier la couleur qui est l'orange
	par défaut
	
"""	
def affiche_texte(texte, x, y, couleur=None):
	if couleur == None:
		couleur = couleurs[ ORANGE_ROLAND_GARROS ]
	rendu = fonte.render(texte, True, couleur)
	rectangle = rendu.get_rect()
	rectangle.center = (x, y)
	fenetre.blit(rendu, rectangle)
	
"""
	quitter le programme
	
	on arrête la musique d'ambiance et on libère les resources
	utilisées par pygame
	
"""	
def quitter():
	pygame.mixer.music.stop()
	pygame.quit()
	sys.exit()

"""
	attend qu'on tape une touche au clavier
	
	on parcourt les événements (clavier, souris) mais en ne
	traitant que l'appui sur une touche (KEYDOWN)
"""
def touche_clavier():
	for event in pygame.event.get():
		if event.type == KEYDOWN:
			# Ctrl-C pour quitter le jeu
			if event.key == pygame.K_c and pygame.key.get_mods() & pygame.KMOD_CTRL:
				quitter()
			# retourner la touche pressée	
			return event.key
		# sinon, ne rien retourner (valeur nulle)	
		return None		 
				
"""
	on attend que l'utilisateur tape une touche du clavier avant
	d'aller plus loin. A chaque itération on redessine la fenêtre
"""				
def attente():
	while touche_clavier() == None:
		pygame.display.update()	
			


###########################################################
# initialisation du jeu
###########################################################
pygame.init()
fenetre = pygame.display.set_mode((LARGEUR_FENETRE, HAUTEUR_FENETRE))
pygame.display.set_caption("Tennis")
pygame.font.init()
fonte = pygame.font.Font(None, 30)	
crash_sound = pygame.mixer.Sound("glass_break.wav")
pygame.mixer.music.load("music.mp3")
pygame.mixer.music.play()

###########################################################
# définition des variables du jeu
###########################################################

balle = balle.Balle(fenetre)

raquette = raquette.Raquette(fenetre)

# nombre de rebonds sur la raquette
score = 0

# variable booléenne à vrai si on est en pause
pause = False


###########################################################
# écran d'accueil
###########################################################
fenetre.fill(couleurs[NOIR])
affiche_texte_centre("Appuyez sur une touche pour commencer", 100)
affiche_texte_centre("Flèche haut pour faire monter la raquette", 140)
affiche_texte_centre("Flèche bas pour faire descendre la raquette", 170)
affiche_texte_centre("p pour pause", 200)
affiche_texte_centre("Ctrl-C pour quitter", 230)
attente()
			
###########################################################
# écran de jeu : boucle principale
###########################################################
while True:
	# temporisation : arrêt de l'exécution du programme pendant 5 ms
	pygame.time.delay(5)
	
	# -------------------------------
	# dessine les différents éléments
	# - fond d'écran
	# - mur de droite
	# - balle
	# - raquette
	# - score
	# -------------------------------
	
	# dessine le fond en orange
	fenetre.fill( couleurs[ ORANGE_ROLAND_GARROS ] )
	# dessine le mur de droite
	pygame.draw.rect(fenetre, couleurs[ VERT_ROLAND_GARROS ], (COORD_X_MUR, 0, 20, HAUTEUR_FENETRE), 0)

	balle.dessine()
	
	raquette.dessine()
	
	# affichage du score
	texte = "Score = {}".format(score)
	affiche_texte_centre(texte, 20, couleurs[VERT_ROLAND_GARROS])
	
	pygame.display.update()

	# -------------------------------
	# gestion des événements clavier
	# - flèche vers le haut 
	# - flèche vers le bas
	# - 'p' pour pause
	# -------------------------------
	
	clavier = touche_clavier()
	if clavier == K_UP:
		raquette.vers_le_haut()
	if clavier == K_DOWN:
		raquette.vers_le_bas()	
	if clavier == K_p:
		pause = not pause

	# si on a appuyé sur 'p' et qu'on met le jeu en pause
	# il ne faut pas aller plus loin c'est à dire qu'il ne
	# faut pas déplacer ni la raquette, ni la balle
	if pause:
		continue
	
	# ------------------------------
	# déplacement de la raquette et de la balle
	# vérification de fin de jeu
	# ------------------------------
		
	raquette.deplace()
		
	balle.deplace()
	
	# si balle en dehors de l'aire de jeu, on quitte la boucle
	# de jeu
	# TODO
	
	# si la balle touche la raquette, on réalise le rebond
	# TODO		

################################
# écran de fin de partie	
################################

fenetre.fill( couleurs[NOIR] )
texte = "Votre score est de {} points".format(score)
affiche_texte_centre(texte)
affiche_texte_centre("Appuyez sur une touche pour terminer", 200)
pygame.mixer.Sound.play(crash_sound)
pygame.mixer.music.stop()
attente()

quitter()


