//Clément Martins et Tom Monin
//Class utiliser pour observateur avec plusieur action possible (en fonction de sa fonction défini a la création) 
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class observateurButtonEtText implements ActionListener {
  private plateau plat;   //le plateau de jeu
  private int fonction;   //la fonction de l'observateur
  private JTextField zone;  // la zone de texte a modifier

  //constructeur
  //@params (le plateau, la fonction, la zone de texte)
  public observateurButtonEtText(plateau plat0, int fonction0, JTextField zone0){
    //on initialise les attributs
    this.plat=plat0;
    this.fonction=fonction0;
    this.zone=zone0;
  }
  @Override
  public void actionPerformed(ActionEvent evenement){
    //si fonction 1 on va adapter la zone de texte en fonction de son contenu
    if(this.fonction==1){
      int nombre=0;
      //try catch pour le parseInt pour voir si le format correspond
      //tant que le format est bon:
      try{
        //on met le fond du texte en blanc
        this.zone.setBackground(new Color(255,255,255));
        //on recupere le nombre contenu dans le text
        nombre=Integer.parseInt(evenement.getActionCommand());
        //si il est inferieur a 0
        if(nombre<0){
          //je le met sur 0 (min de bombe)
          nombre=0;
        }
        //si les collonnes et les ligne ne sont pas encore selectionner
        //vu par les valeur sentinnelles (-1)
        if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1){
          //si il y a plus de bombe que de case
          if(nombre>this.plat.getLigne()*this.plat.getCollonne()){
            //on repositionne le nombre de bombe au maximun
            nombre=this.plat.getLigne()*this.plat.getCollonne();
          }
          //on affiche le nombre dans la zone de text
          this.zone.setText(String.valueOf(nombre));
        }else{
          //si les ligne et les collonnes ne sont pas encore selectionner
          //fond e rouge
          this.zone.setBackground(Color.red);
          //on précise a l'utilisateur se que l'ont veut
          this.zone.setText("Selectionner Ligne et Collonne Avant");
          //on précisera au plateau que le choix des bombes n'est plus bon
          //par une valeur sentinnelles
          //pour eviter de garder l'ancien nombre si il y en avait un
          nombre=-1;
        }
        //on dis au plateau le nombre de bombe
        this.plat.setBombe(nombre);
      }catch(NumberFormatException e1){
        //si le format n'est pas bon
        //fond en rouge
        this.zone.setBackground(Color.red);
        //on précise a l'utilisateur l'erreur
        this.zone.setText("rentrer un entier");
        //on précisera au plateau que le choix des bombes n'est plus bon
        //par une valeur sentinnelles
        //pour eviter de garder l'ancien nombre si il y en avait un
        this.plat.setBombe(-1);
      }
    }
    //si la fonction est 2
    if(this.fonction==2){
      int nombre=0;
      //try catch pour les format pas bon
      //tant que il n'y a pas d'Exception
      try{
        //fond en blanc
        this.zone.setBackground(new Color(255,255,255));
        //le nombre est = au nombre dans la zone de texte
        nombre=Integer.parseInt(this.zone.getText());
        //si inferieur a 0
        if(nombre<0){
          //nombre a 0 (min de bombe)
          nombre=0;
        }
        //si collonne et ligne deja existant
        if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1){
          //si ce nombre > nb de Case
          if(nombre>this.plat.getLigne()*this.plat.getCollonne()){
            //nombre = nombre max de bombe
            nombre=this.plat.getLigne()*this.plat.getCollonne();
          }
          //on précise au plateau le nombre de bombe
          this.plat.setBombe(nombre);
          //si il tout est deja initialiser (ligne, collonne et bombe)
          if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1 && this.plat.getBombe()!=-1){
            //on lance la nouvelle partie
            this.plat.newGame();
          }else{
            //autrement 
            if(this.plat.getBombe()==-1){
            this.zone.setBackground(Color.red);
            this.zone.setText("Rentrer un nombre de Bombe");
            }
          }
        }else{
          this.zone.setBackground(Color.red);
          this.zone.setText("Selectionner Ligne et Collonne Avant");
          this.plat.setBombe(-1);
        }
        this.plat.setBombe(nombre);
      }catch(NumberFormatException e1){
        this.zone.setBackground(Color.red);
        this.zone.setText("rentrer un entier");
        this.plat.setBombe(-1);
      }
    }
    if(this.fonction==3){
      //si fonction 3 donc boutons +
      //plusoumoins avec comme argument +1
     this.plusoumoins(1);
    }
    if(this.fonction==4){
      //si fonction 4 donc boutons -
      //plus ou moins avec argument -1
      this.plusoumoins(-1);
    }
  }
  private void plusoumoins(int n){
    int nombre=0;
    //try catch pour les gestion de format non conforme
    //tant que il n'y a pas d'exception
    try{
      //fond en blanc
      this.zone.setBackground(new Color(255,255,255));
      //le nombre = nombre deja présent + l'argument
      nombre=Integer.parseInt(this.zone.getText())+n;
      //si le nombre <0 nombre = au minimum
      if(nombre<0){
        nombre=0;
      }
      //si les collonnes et les lignes existe deja
      if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1){
        //si le nomnbre > au nombre de case
        // nombre = nombre de case
        if(nombre>this.plat.getLigne()*this.plat.getCollonne()){
          nombre=this.plat.getLigne()*this.plat.getCollonne();
        }
        //on indique a l'utilisateur le nouveau nombre
        this.zone.setText(String.valueOf(nombre));
      }else{
        //si pas de ligne et de collonnes
        //fond en rouge
        this.zone.setBackground(Color.red);
        //on indique a l'utilisateur les précondition avant de remplir ce champs
        this.zone.setText("Selectionner Ligne et Collonne Avant");
        //on indique au plateau que le choix n'est toujours pas fait
        nombre=-1;
      }
      //on précise au plateau le nombre de bombe choisit
      this.plat.setBombe(nombre);
    }catch(NumberFormatException e1){
      //si format inchohérent
      //fond en rouge
      this.zone.setBackground(Color.red);
      //on précise ce que l'ont veut
      this.zone.setText("rentrer un entier");
      //on indique au plateau que le choix n'est toujours pas fait
      this.plat.setBombe(-1);
    }
  }
}