package linea;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;

import javax.swing.JPanel;

public class ZoneDessin extends JPanel {

    private static final long serialVersionUID = 1L;
    
    // un booleen qui permet d'arreter l'animation (suspendre)
    protected boolean estArrete = false;
    
    // liste des objets graphiques
    private ArrayList<ObjetGraphique> listeObjets = new ArrayList<ObjetGraphique>();
    // indicateur qu'une défaite (perte de contact) est survenue
    private boolean collisionOccur = false;
    // indique si le cercle a déjà été sur la ligne (début de la phase de maintien)
    private boolean hadBeenOnLine = false;
    
    public ZoneDessin(){
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(800, 600));
        setBackground(new Color(220,170,0));		
    }

    // Ajout d'un objet graphique à la zone de dessin
    public void ajouterObjet(ObjetGraphique unObjet) {
        listeObjets.add(unObjet);
    }
    
    public void arreter(){
        estArrete = true;
    }
    
    public void demarrer(){
        estArrete = false;
    }
    
    public void traiterBoucleAnimation(){
        if (estArrete==true) {
            return;
        }
        
        // 1. on déplace chaque objet graphique
        for (ObjetGraphique obj : listeObjets){
            obj.Animer();
        }
        
        // 2. vérifier collisions entre une Ligne et un Cercle
        for (ObjetGraphique obj : listeObjets) {
            if (obj instanceof Ligne) {
                Ligne l = (Ligne) obj;
                for (ObjetGraphique other : listeObjets) {
                    if (other instanceof Cercle) {
                        Cercle c = (Cercle) other;
                        // On commence à surveiller une fois que le centre du
                        // cercle est au-dessus d'un segment (le cercle est "sur la ligne").
                        if (l.estSurLaLigne(c.getX())) {
                            hadBeenOnLine = true;
                            // Si le cercle n'est plus en contact (distance > rayon)
                            // alors le joueur perd (il doit maintenir le contact).
                            if (!l.collisionAvec(c)) {
                                collisionOccur = true;
                                estArrete = true;
                                break;
                            }
                        }
                    }
                }
                if (estArrete) break;
            }
        }

        // 3. on demande à redessiner
        repaint();	
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);		

        Graphics2D g2D = (Graphics2D) g;
        g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
        // Afficher tous les objets
        for (ObjetGraphique obj : listeObjets) {
            obj.Afficher(g);
        }
    }

    // Indique si une collision est survenue
    public boolean aCollision() {
        return collisionOccur;
    }

    // Réinitialise l'état de la zone de dessin et supprime les objets graphiques
    public void reinitialiser() {
        listeObjets.clear();
        estArrete = false;
        collisionOccur = false;
        hadBeenOnLine = false;
        repaint();
    }
}