import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ZoneDessin extends JPanel { // hérite d'une classe du frameWork standard 

	private static final long serialVersionUID = 1L;
	
	//-------------------------------------------------------------------------
	// PROPRIETES
	//-------------------------------------------------------------------------
	public boolean partiePerdue = false;
	// un booleen qui permet d'arreter l'animation (suspendre)
	protected boolean estArrete = false;
	
	// Une liste d'objets graphique
	// Pour permettre à traiterBoucleAnimation() de parcourir les objets sans distinction pour les animer
	protected  ArrayList<ObjetGraphique> listeObjets = new ArrayList<>();

	// Variable pour l'image
	protected Image imageDeFond;

	// Variable pour stocker l'objet Background au lieu d'une simple image
	protected Background fondActuel;
	
	//-------------------------------------------------------------------------
	// METHODES
	//-------------------------------------------------------------------------
	
	//-------------------------------------------------------------------------
	// Constructeur de la classe
	//-------------------------------------------------------------------------	
	public ZoneDessin(Background fondInitial){
		// on prépare la zone d'affichage
		setLayout(new BorderLayout());
		setPreferredSize(new Dimension(800, 600));
		this.fondActuel = fondInitial;
		
	}

	//Redefinition de la méthode setBcakground grâce à ma classe Background
	public void setBackground(Background nouveauFond){
		this.fondActuel = nouveauFond;

		// On redessine le fond
		this.repaint();
	}
	
	// Méthode pour modifier l'image de fond depuis la classe Jeu
	public void changerImageFond(String cheminDansSrc){
		try {
			java.net.URL url = getClass().getResource("/" + cheminDansSrc); // On cherche l'image depuis src
			if(url != null){
				java.awt.Image img = ImageIO.read(url);
				this.fondActuel = new Background(img);
				this.repaint(); // On redessine le fond
			}else{
				System.err.println("URL introuvable pour : " + cheminDansSrc);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	//-------------------------------------------------------------------------
	// Ajout d'un objet graphique à la zone de dessin
	//-------------------------------------------------------------------------	
	public void ajouterObjet(ObjetGraphique unObjet) {
		this.listeObjets.add(unObjet);
	}
	
	
	//-------------------------------------------------------------------------
	// Mettre en pause et redémarrer
	//-------------------------------------------------------------------------	
	public void arreter(){
		estArrete = true;
	}
	
	public void demarrer(){
		estArrete = false;
	}
	

	//-------------------------------------------------------------------------
	// Boucle d'animation : 
	// 	- appelée par exemple 25 fois par seconde
	//	- à chaque appel :
	//		- on anime (déplace) chaque objet
	//		- on redessine tout : appel à paintComponent, déclenché par repaint
	//-------------------------------------------------------------------------	
	public void traiterBoucleAnimation(){
		if (estArrete==true) {
			return;
		}
		
		// 1. on déplace chaque objet graphique
		// A FAIRE : décommenter lorsque cela devienda exécutable, et compléter
		
		for (ObjetGraphique obj : listeObjets){
			// A FAIRE : demander à obj de s'animer
			obj.Animer();
		}
		
		
		
		// 2. on demande à redessiner, ce qui déclenchera automatiquement 
		//  l'appel à la méthode paintComponent, qui est ci-dessous
		repaint();		
	}
	
	
	//-------------------------------------------------------------------------
	// Dessin, déclenché par le repaint() de la méthode ci-dessus 
	//-------------------------------------------------------------------------
	public void paintComponent(Graphics g) {
		// On demande à la super-classe (JPanel) de se redessiner
		super.paintComponent(g);		

		// Puis on ajoute ce qui est spécifique à la classe
		if(fondActuel != null && fondActuel.getImage() != null){
			g.drawImage(fondActuel.getImage(), 0, 0, getWidth(), getHeight(), this);
		}

		// on indique qu'il faut de l'antialiasing 
		Graphics2D g2D = (Graphics2D) g;
		g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

		// à compléter
		for(ObjetGraphique obj: listeObjets){
			obj.Afficher(g); //Chaque objet se dessine lui-même
		}
		if (this.partiePerdue) {
			g.setColor(Color.RED);
			g.setFont(new java.awt.Font("Arial", java.awt.Font.BOLD, 50));
			g.drawString("GAME OVER", 250, 300);
    	}
	}
	
}
	
	
