//Tom Monin et Clément Martins
// observateurChoix V4
//Class de l'observateur des Cases
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.time.*;

public class observateurCase implements MouseListener{
	private int ligne, collonne;
	private Case[][] tableau;
	private plateau plat;
	public observateurCase(int ligne0, int collonne0, Case[][] tableau0, plateau plat0){
		this.ligne=ligne0;
		this.collonne=collonne0;
		this.tableau=tableau0;
		this.plat=plat0;
	}
	@Override
	public void mouseClicked(MouseEvent evenement){
		//si on clique gauche
		if(evenement.getButton() == MouseEvent.BUTTON1){
			//si la case n'est pas suspecter(d'etre une bombe ou je sais pas) et que elle n'est pas visible
			if(this.tableau[this.ligne][this.collonne].getSuspition()==0 && this.tableau[this.ligne][this.collonne].getVisibiliter()==false){
				//nous la rendons visible et la reafichons
				this.tableau[this.ligne][this.collonne].setVisibiliter(true);
				this.tableau[this.ligne][this.collonne].repaint();
				//si elle n'a pas de voisin nous pouvons afficher les case aux alentours qui serons évidentes a cliquer
				if(this.tableau[this.ligne][this.collonne].getVoisin()==0 && this.tableau[this.ligne][this.collonne].getBombe()==false){
					this.cliqueEvident(this.ligne, this.collonne);	
				}			
			}
		}
		//si clique droit
		if(evenement.getButton() == MouseEvent.BUTTON3){
			//nous modifions la suspitions de la case et la reafichons si la case n'est pas visible
			if(this.tableau[this.ligne][this.collonne].getVisibiliter()==false){
				this.tableau[this.ligne][this.collonne].suspition();
				this.tableau[this.ligne][this.collonne].repaint();
			}
			//nous testons si le joeur a gagner/perdu
			if(this.tableau[this.ligne][this.collonne].getSuspition()==1){
				plat.setScore(-1);
			}if(this.tableau[this.ligne][this.collonne].getSuspition()==2){
				plat.setScore(+1);
			}
			
		}
		//nous testons si le joueur a gagner/perdu
		//si perdu
		if(plat.etatDeVictoire()==-1){
			//on precise quelle case a exploser
			this.tableau[this.ligne][this.collonne].setSuspition(4);
		}
		//si gagner
		if(plat.etatDeVictoire()==1){
			//on initialise le nombre de minute a 0
			int min=0;
			//on regarde si le joueur a passer plus de 1h
			if(LocalTime.now(ZoneId.systemDefault()).getHour()-this.plat.getTemps().getHour()>0){
				//si oui on recupere ses minutes avec h*60 plus n minute
				min+=LocalTime.now(ZoneId.systemDefault()).getHour()-this.plat.getTemps().getHour()*60;
			}
			//le score sera calculer de cette manière:
			//frequence de bombe par rapport au nombre de case *10 000 / le temps en min passer a le résoudre
			//temps en minute:
			float resultatTemps=LocalTime.now(ZoneId.systemDefault()).getMinute()+this.plat.getMinute()-this.plat.getTemps().getMinute()+1;
			//fréquence des bombe
			float frequenceBombe=(this.plat.getBombe()*10000)/(this.plat.getLigne()*this.plat.getCollonne());
			//score final= frequenceBombe/resultatTemps
			//on affiche au joueur son score
			JOptionPane.showMessageDialog(this.plat.getFenetre(), "Vous avez gagné! \n Votre score est de "+frequenceBombe/resultatTemps);
		}
	}
	@Override          // un bouton cliqué
	public void mouseEntered(MouseEvent evenement){

	}
	@Override          // debut du survol
	public void mouseExited(MouseEvent evenement){
	}
	@Override          // fin du survol
	public void mousePressed(MouseEvent evenement){

	}
	@Override          // un bouton appuyé
	public void mouseReleased(MouseEvent evenement){

	}

	//--------------------------------fonction permettant d'afficher toutes les case n'ayant pas de voisin adjacente utilisant plusieur fonction récursive-----------------------------


	private void cliqueEvident(int ligneDelta, int collonneDelta){
		//nous affichons la case si elle n'est pas suspecter (pour laisser l'erreur au joueur)
		if(this.tableau[ligneDelta][collonneDelta].getSuspition()==0){
			this.tableau[ligneDelta][collonneDelta].setVisibiliter(true);
			this.tableau[ligneDelta][collonneDelta].repaint();
		}
		//nous affichons les cases possédants des voisins
		this.affichageVoisinEvident(ligneDelta, collonneDelta);
		//si la case du haut existe et n'est pas visible et n'a pas de voisin et n'est pas une bombe
		if(ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta].getVoisin()==0 && this.tableau[ligneDelta-1][collonneDelta].getBombe()==false){
			//on utilise la fonction recurisve sur la case du haut
			this.cliqueEvident(ligneDelta-1, collonneDelta);
		}
		//la même chose pour les 8 cases possible donc recursivite possible (voir principe en haut)
		if(collonneDelta>0 && ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta-1].getVoisin()==0 && this.tableau[ligneDelta-1][collonneDelta-1].getBombe()==false){
			this.cliqueEvident(ligneDelta-1, collonneDelta-1);
		}
		if(ligneDelta<tableau.length-1 && this.tableau[ligneDelta+1][collonneDelta].getVisibiliter()==false && this.tableau[ligneDelta+1][collonneDelta].getVoisin()==0 && this.tableau[ligneDelta+1][collonneDelta].getBombe()==false){	
			this.cliqueEvident(ligneDelta+1, collonneDelta);
		}
		if(collonneDelta<tableau[ligneDelta].length-1 && this.tableau[ligneDelta][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta][collonneDelta+1].getVoisin()==0 && this.tableau[ligneDelta][collonneDelta+1].getBombe()==false){
			this.cliqueEvident(ligneDelta, collonneDelta+1);
		}
		if(collonneDelta>0 && this.tableau[ligneDelta][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta][collonneDelta-1].getVoisin()==0 && this.tableau[ligneDelta][collonneDelta-1].getBombe()==false){
			this.cliqueEvident(ligneDelta, collonneDelta-1);
		}
		if(collonneDelta>0 && ligneDelta<this.tableau.length-1 && this.tableau[ligneDelta+1][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta+1][collonneDelta-1].getVoisin()==0 && this.tableau[ligneDelta+1][collonneDelta-1].getBombe()==false){
			this.cliqueEvident(ligneDelta+1, collonneDelta-1);
		}
		if(collonneDelta<this.tableau[ligneDelta].length-1 && ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta+1].getVoisin()==0 && this.tableau[ligneDelta-1][collonneDelta+1].getBombe()==false){
			this.cliqueEvident(ligneDelta-1, collonneDelta+1);
		}
		if(collonneDelta<this.tableau[ligneDelta].length-1 && ligneDelta<this.tableau.length-1 && this.tableau[ligneDelta+1][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta+1][collonneDelta+1].getVoisin()==0 && this.tableau[ligneDelta+1][collonneDelta+1].getBombe()==false){
			this.cliqueEvident(ligneDelta+1, collonneDelta+1);
		}
	}

	//--------------------------------------fonction qui affiche toutes les case possédant un voisin d'une case donnée------------------------------------------


	private void affichageVoisinEvident(int ligneDelta, int collonneDelta){
		//nous regardons les 8 case adjacentes et si elle a des voisin
		//si elle en a alors nous la rendons visible
		if(ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta].getVoisin()>0 && this.tableau[ligneDelta-1][collonneDelta].getSuspition()==0){
			this.tableau[ligneDelta-1][collonneDelta].setVisibiliter(true);
			this.tableau[ligneDelta-1][collonneDelta].repaint();
		}
		if(ligneDelta<tableau.length-1 && this.tableau[ligneDelta+1][collonneDelta].getVisibiliter()==false && this.tableau[ligneDelta+1][collonneDelta].getVoisin()>0 && this.tableau[ligneDelta+1][collonneDelta].getSuspition()==0){	
			this.tableau[ligneDelta+1][collonneDelta].setVisibiliter(true);
			this.tableau[ligneDelta+1][collonneDelta].repaint();
		}
		if(collonneDelta<tableau[ligneDelta].length-1 && this.tableau[ligneDelta][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta][collonneDelta+1].getVoisin()>0 && this.tableau[ligneDelta][collonneDelta+1].getSuspition()==0){
			this.tableau[ligneDelta][collonneDelta+1].setVisibiliter(true);
			this.tableau[ligneDelta][collonneDelta+1].repaint();
		}
		if(collonneDelta>0 && this.tableau[ligneDelta][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta][collonneDelta-1].getVoisin()>0 && this.tableau[ligneDelta][collonneDelta-1].getSuspition()==0){
			this.tableau[ligneDelta][collonneDelta-1].setVisibiliter(true);
			this.tableau[ligneDelta][collonneDelta-1].repaint();
		}
		if(collonneDelta>0 && ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta-1].getVoisin()>0 && this.tableau[ligneDelta-1][collonneDelta-1].getSuspition()==0){
			this.tableau[ligneDelta-1][collonneDelta-1].setVisibiliter(true);
			this.tableau[ligneDelta-1][collonneDelta-1].repaint();
		}
		if(collonneDelta>0 && ligneDelta<this.tableau.length-1 && this.tableau[ligneDelta+1][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta+1][collonneDelta-1].getVoisin()>0 && this.tableau[ligneDelta+1][collonneDelta-1].getSuspition()==0){
			this.tableau[ligneDelta+1][collonneDelta-1].setVisibiliter(true);
			this.tableau[ligneDelta+1][collonneDelta-1].repaint();
		}
		if(collonneDelta<this.tableau[ligneDelta].length-1 && ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta+1].getVoisin()>0 && this.tableau[ligneDelta-1][collonneDelta+1].getSuspition()==0){
			this.tableau[ligneDelta-1][collonneDelta+1].setVisibiliter(true);
			this.tableau[ligneDelta-1][collonneDelta+1].repaint();
		}
		if(collonneDelta<this.tableau[ligneDelta].length-1 && ligneDelta<this.tableau.length-1 && this.tableau[ligneDelta+1][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta+1][collonneDelta+1].getVoisin()>0 && this.tableau[ligneDelta+1][collonneDelta+1].getSuspition()==0){
			this.tableau[ligneDelta+1][collonneDelta+1].setVisibiliter(true);
			this.tableau[ligneDelta+1][collonneDelta+1].repaint();
		}
	}
}