package fr.cnam.joueur;

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.util.*;
import java.awt.Point;
import java.lang.reflect.*;


import fr.cnam.espacetore.*;
import fr.cnam.joueur.*;
import fr.cnam.util.*;

public class FactoryAgent implements FactoryAgentInt
{
  static private FactoryAgent singleton=null;
  static private int portRMI=9200;
  static private String hostEspaceTore="localhost";
  static private int portEspaceTore=9100;

  private ArrayList<AgentInt> agents;
  private EspaceToreODInt espaceTore;

  private CreationAgentInt builder;

  static FactoryAgentInt getInstance()
  {
    if (singleton!=null) return singleton;
    else 
      {
        singleton = new FactoryAgent();
        return singleton;
      }
  }

  static void initialisation(int portRMI,
                             String hostEspaceTore,
                             int    portEspaceTore)
  {
    FactoryAgent.portRMI=portRMI;
    FactoryAgent.hostEspaceTore=hostEspaceTore;
    FactoryAgent.portEspaceTore=portEspaceTore;
  }
            

  private FactoryAgent()
  {
    int casex=0;
    try{
      casex=1;
      this.agents = new ArrayList<AgentInt>();
            
      espaceTore = (EspaceToreODInt)(Naming.lookup("rmi://"+hostEspaceTore+":"+
                                                   portEspaceTore+"/"+
                                                   EspaceToreOD.NOM_ESPACE_TORE));
      System.out.println("Connexion à l'espace de Tore réussi");

      casex=2;
      builder = (CreationAgentInt)Proxy.newProxyInstance( 
                                                         ClassLoader.getSystemClassLoader(),
                                                         new Class<?>[] { CreationAgentInt.class },
                                                         new DynamicCreationAgent());
    }catch(Exception ex)
      {
        switch(casex)
          {
          case 1:
            System.out.println("Pb connexion : "+hostEspaceTore+" "+
                               portEspaceTore+" "+EspaceToreOD.NOM_ESPACE_TORE);
            espaceTore=null;
            break;
          case 2:
            System.out.println("Pb de creation du builder");
            builder=null;
            break;
          default:
            break;
          }
      }
  }

  public AgentInt creerAgent(String nomClasseAgent,int couleur) throws RemoteException
  {
    if(builder==null) {System.out.println("Builder null"); return null; }

    // Creation d'un agent dynamiquement
    builder.creerAgent(nomClasseAgent,couleur);
    
    // Recuperation de l'agent cree
    AgentInt agent = builder.getAgent();
    if (agent!=null)
      {
        // Ajout de l'agent cree dans la collection
        agents.add(agent);
      }
    else {System.out.println("L'agent demande n'a pas ete cree");}

    return agent;
  }

  public int getTauxMortalite()
  {
    try{
      int nbMort=0;
      for(AgentInt a : agents)
        if (a.getNbVie()<=0) nbMort++;
      if (nbMort==0) return 0;
      else return((nbMort*100)/agents.size());
    }catch(Exception ex){return 0;}
  }

  public EspaceToreODInt getEspaceTore()
  {return espaceTore;}

  public String getPathClassesAgent()
  {
    return ChargeurDefaut.pathClasses;
  }
    
  public int getPortRMI() { return portRMI;}
    
}