import java.lang.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.rmi.*;

/** 
Ce thread est actif lorsque le joueur courant a termine son tour et que le
* deuxieme joueur doit jouer. Il surveille le tableau des cases. Lorsqu'un
* pion est ajoute dans ce tableau il demande au Puissance4graphique de se 
* repeindre. Il affiche aussi les messages de fin de partie. Il s'endort 
* toutes les 100 ms.
@author Sebastien BISMUTH 
@author Yann LENNE
@version 1.1.6
*/

public class Ecouteur extends Thread { 

  /** Acces aux methodes de l'objet Puissance4 */
  private Puissance4Distant pd;

  /** Dessin du tableau de jeu et des pions */
  private Puissance4Graphique pg;
  
  /** numero du joueur */
  private char numJoueur;

  /** Fenetre principale du jeu */
  private FenJeu fen;

  /** Gestion des coups des joueurs. 
    * Lancement du Thread pour detecter les actions de l'autre joueur 
    @param pg Canvas contenant les cases */

  public Ecouteur(Puissance4Graphique pg, char num, FenJeu f) {
    numJoueur = num;
    fen = f;
    this.pg = pg;
    this.pd = pg.getP4Distant();
    this.start();
  } 
  
  /** Attend que l'autre joueur ajoute un pion.
    * Boucle et verifie si le tableau des pions a ete modifie. 
    * Lorsque c'est le cas, demande le dessin du  nouveau pion. */

  public void run() {       
    char dernierJoueur = numJoueur;
    char jg;
    Point[] casesGagnantes = new Point[4];
    
    while(true) {
      try {
        // L'un des joueurs desire recommencer
        if(pd.getRecommencer() && !pg.getJeVeuxRecommencer()) {
          fen.btRecoActif(false);
          pg.setToutPeindre(true);
          pg.setPartieGagnee(false);
          
          try{
            if (pd.prochainJoueur() != numJoueur){
              pg.monTour(false);
            }
            else{
              pg.monTour(true);
            }
          } catch(Exception e){e.printStackTrace();}
          
          
          pg.repaint();
          pd.setRecommencer(false);
        }
        else{
          pg.setJeVeuxRecommencer(false);
        }

        try{
          // Un autre joueur a clique sur le sous menu Quitter
          if(pd.getQuitter()) {
            pg.getMessage().setText("Un autre joueur a quitte la partie ... Deconnexion dans 3s");
            try{
              sleep(3000);
            }
            catch(InterruptedException e){e.printStackTrace();}
            System.exit(0);
          }
        } catch(RemoteException re){re.printStackTrace();} 

        // Un joueur a ajoute un pion 
        if(pd.getDernierJoueur() != dernierJoueur) {
          
          dernierJoueur = pd.getDernierJoueur();
          pg.setToutPeindre(false);
          pg.repaint();
          
          jg = pd.getJoueurGagnant();
          
          // Verifie si un joueur a gagne
          if (jg != '0') {
            if (pd.matchNul()){
              pg.getMessage().setText("Match nul : vous etes tous mauvais");
            }
            else{
              casesGagnantes = pd.getCasesGagnantes();
              pg.setPartieGagnee(true);
              pg.setCasesGagnantes(casesGagnantes);
              if (jg == numJoueur)
                pg.getMessage().setText("Vous avez gagne");
              else {
                pg.getMessage().setText("Vous avez perdu : " + pd.getPseudoJoueur(jg) + " a gagne");
              }
            }
            pg.repaint();
            fen.btRecoActif(true);
          } 
          
          // Le dernier joueur n'a pas gagne, je regarde si c'est mon tour
          else {
            if(pd.prochainJoueur() == numJoueur) {
              pg.monTour(true);
              this.suspend();
            }
            else
              pg.monTour(false);
          }
        }
        sleep(100);
      }
      catch (RemoteException e) {e.printStackTrace();} 
      catch (InterruptedException e) {e.printStackTrace();} 
      
    } // fin while(true)
  }
}
