package fr.cnam.joueur;

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;

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

public class FactoryAgentOD extends UnicastRemoteObject implements FactoryAgentInt
{
    private FactoryAgentInt factory;

    public FactoryAgentOD(String nomFactory,
                          int portRMIFactory,
                          int portAdaptateur,
                          FactoryAgentInt factory) throws Exception
        {
            super(portRMIFactory);
            System.out.println("Constructor UnicastRemoteObject : port "+
                               portRMIFactory);
            this.factory=factory;
            
            try{
                LocateRegistry.createRegistry(portAdaptateur);
                System.out.println("Creation du service de nommage : port "+portAdaptateur);
            } catch(Exception ex){}

            String name = "rmi://localhost:" +
                portAdaptateur +
                "/" +
                nomFactory;
            
            Naming.bind(name,this);
            System.out.println("Bind : "+name+" port "+portAdaptateur);
        }
    
    public AgentInt creerAgent(String nomClasseAgent,int couleur) throws RemoteException
    {
      // Creation de l'agent par le factory
      AgentInt agent = factory.creerAgent(nomClasseAgent,couleur);

      // On retourne le stub de l'agent pour les utilisateurs
      //  distant du factory
      return (AgentInt)(UnicastRemoteObject.toStub(agent));
    }

    public int getTauxMortalite() throws RemoteException
    {
        return factory.getTauxMortalite();
    }

    public EspaceToreODInt getEspaceTore() throws RemoteException
    {
        return factory.getEspaceTore();
    }

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

  public int getPortRMI() throws RemoteException
  {
    return factory.getPortRMI();
  }

    
    static public void main(String... args) throws Exception
    {
        Parametres params = new Parametres(args);

        // Nom du factory
        String nomFactory = params.getString("nom_od","FACTORY");
        
        // Port RMI des OD (factory, agents)
        int portRMI = params.getInt("port_od",9102);
        
        // Port Adaptateur du factory
        int portAdaptateur = params.getInt("port_adaptateur",9100);
        
        // Couleur du joueur
        int couleur=params.getInt("couleur",1);

        // Host de l'espace de tore
        String hostEspaceTore = params.getString("host_espace_tore","localhost");
        // Port de l'espace de tore
        int portEspaceTore = params.getInt("port_espace_tore",9100);

        // Path des classes d'agent
        ChargeurDefaut.pathClasses = params.getString("pathClasses");

        // Initialisation du factory
        FactoryAgent.initialisation(portRMI,hostEspaceTore,portEspaceTore);

        FactoryAgentOD factory = new FactoryAgentOD(nomFactory,
                                                    portRMI,
                                                    portAdaptateur,
                                                    FactoryAgent.getInstance());
    }
}