// Tom Monin et Clément Martins
// paintChoix V3
// class représentant une case dans la partie

import java.awt.*;
import javax.swing.*;
import javax.swing.JComponent;

public class Case extends JComponent{
	//Etat de la case:
	private boolean visibilite; 	//Visible ou pas
	private boolean bombe;			//Miner ou pas
	private int voisin;				//Le nombre de mine aux alentours
	private int suspition;			// son Etat de suspition ( 0:pas une bombe, 1:en est une, 2:je doute)
	// Les Images de la case (point d'interogation, etoile et bombe...) ne sont pas des attributs de la classe Case car
	//pour faciliter la sauvegarde et donc permettre de sérialiser l'objet les attribut devrons être des classes réalisant Serializable ou Externialisable

	//Constructeur de la Case
	public Case(){
		//nous initialisons les valeurs
		this.visibilite=false;		//la visibiler est fausse donc la case est cacher
		this.bombe=false;			// ce n'est pas une bombe
		this.voisin=0;				// elle n'a pas de voisin bombe
		this.suspition=0;			// la suspition est a 0 (pas une bombe)
	}

	// Nous mettons les getter/setter

	public void setVisibiliter(boolean trueorfalse){
		this.visibilite=trueorfalse;
	}
	public void setBombe(){
		this.bombe=true;
	}
	public void suspition(){
		this.suspition++;
		if(this.suspition==3){
			this.suspition=0;
		}
	}
	public void setSuspition(int n){
		this.suspition=n;
		//valeur sentinel pour montrer que c'est cette case qui a exploser
	}
	public boolean getBombe(){
		return this.bombe;
	}
	public void setVoisin(int nvoisin){
		this.voisin=nvoisin;
	}
	public int getSuspition(){
		return this.suspition;
	}
	public boolean getVisibiliter(){
		return this.visibilite;
	}
	public int getVoisin(){
		return this.voisin;
	}

	//on paint la case en fonction de ses attribut et donc son etat
  	@Override
	protected void paintComponent(Graphics pinceau) {
    	// obligatoire : on crée un nouveau pinceau pour pouvoir le modifier plus tard
    	Graphics secondPinceau = pinceau.create();
    	// obligatoire : si le composant n'est pas censé être transparent
    	if (this.isOpaque()) {
      	// obligatoire : on repeint toute la surface avec la couleur de fond
      	secondPinceau.setColor(this.getBackground());
      	secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight());
    	}
    	//On paint ce que l'on veut maintenant
    	//si la case est cacher (pas visible)
    	if(this.visibilite==false){
    		//on dessinne un rectangle gris sur un fond noir
    		secondPinceau.setColor(new Color(0,0,0));
    		secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight());
    		secondPinceau.setColor(new Color(100, 100, 100));
    		secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18);
    		//si on supecte que c'est une bome
    		if(this.suspition==1){
    			//on affiche l'etoile
    			Image etoile= Toolkit.getDefaultToolkit().getImage("./IMAGE/etoile.png");
    			secondPinceau.drawImage(etoile, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    		}
    		//si on suspecte que on ne sais pas
    		if(this.suspition==2){
    			Image interogation= Toolkit.getDefaultToolkit().getImage("./IMAGE/pointintero.png");
    			//on affiche le point d'interogation
    			secondPinceau.drawImage(interogation, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    		}
    	}
    	//si la case est afficher(visible)
    	if(this.visibilite==true){
    		//on dessine un rectangle blanc sur un fond noir
    		secondPinceau.setColor(new Color(0,0,0));
    		secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight());
    		secondPinceau.setColor(new Color(255, 255, 255));
    		secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18);
    		//si la case a au moins 1 voisin qui est une bombe
    		if(this.voisin>0){
    			//on ecrit le nombre de voisin que elle a
    			if(this.voisin==1){
    				Image un=Toolkit.getDefaultToolkit().getImage("./IMAGE/un.jpg");
    				secondPinceau.drawImage(un, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			if(this.voisin==2){
    				Image deux=Toolkit.getDefaultToolkit().getImage("./IMAGE/deux.jpg");
    				secondPinceau.drawImage(deux, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			if(this.voisin==3){
    				Image trois=Toolkit.getDefaultToolkit().getImage("./IMAGE/trois.jpg");
    				secondPinceau.drawImage(trois, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			if(this.voisin==4){
    				Image quatre=Toolkit.getDefaultToolkit().getImage("./IMAGE/quatre.jpg");
    				secondPinceau.drawImage(quatre, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			if(this.voisin==5){
    				Image cinq=Toolkit.getDefaultToolkit().getImage("./IMAGE/cinq.png");
    				secondPinceau.drawImage(cinq, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			if(this.voisin==6){
    				Image six=Toolkit.getDefaultToolkit().getImage("./IMAGE/six.jpg");
    				secondPinceau.drawImage(six, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			if(this.voisin==7){
    				Image sept=Toolkit.getDefaultToolkit().getImage("./IMAGE/sept.jpg");
    				secondPinceau.drawImage(sept, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			if(this.voisin==8){
    				Image huit=Toolkit.getDefaultToolkit().getImage("./IMAGE/huit.jpg");
    				secondPinceau.drawImage(huit, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    			//si la case est supecter mais visible (possible que si le joueur a perdu) et que ce n'est pas une bombe
    			//on affiche un fond rouge pour mettre en valeur l'erreur
    			if(this.suspition==1 && this.bombe==false){
    				secondPinceau.setColor(new Color(255, 0, 0));
    				secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18);
    				Image etoile= Toolkit.getDefaultToolkit().getImage("./IMAGE/etoile.png");
    				secondPinceau.drawImage(etoile, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    		}
    		//si la case est une bombe
    		if(this.bombe==true){
    			//si la bombe est suspecter mais afficher (possible que si le joeur perd)
    			if(this.suspition==1){
    				//on affiche l'etoile sur fond vert pour préciser que le joueur avait raison
    				secondPinceau.setColor(new Color(0, 255, 0));
    				secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18);
    				Image etoile= Toolkit.getDefaultToolkit().getImage("./IMAGE/etoile.png");
    				secondPinceau.drawImage(etoile, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
  					//autrement nous afficherons l'image de la bombe
    			}else{
    				Image imgboombe= Toolkit.getDefaultToolkit().getImage("./IMAGE/bombe.png");
    				//si la suspition est de 4 (possible que si c'est la bombe qui a exploser) valeur sentinelle
    				if(this.suspition==4){
    					//on dessine un rectangle rouge
    					secondPinceau.setColor(new Color(255,0,0));
    					secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18);
    				}else{
    					//on dessine un rectangle orange pour montrer que la case était une bombe
    					secondPinceau.setColor(new Color(200, 127, 0));
    					secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18);
    				}
    				//on affiche la bombe
    				secondPinceau.drawImage(imgboombe, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this);
    			}
    		}
    	}
	}
}