package fr.cnam.espacetore;

import java.lang.*;
import java.util.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.awt.Point;
import fr.cnam.joueur.*;
import fr.cnam.util.*;
import fr.cnam.espacetore.*;

// OD qui encapsule l'espace de tore afin qu'il puisse etre utilise 
//  de maniere distante
//  
public class EspaceToreOD extends UnicastRemoteObject implements EspaceToreODInt
{
    final public static String NOM_ESPACE_TORE = "ESPACE_TORE";
    
    EspaceToreInt espaceTore;

    public EspaceToreOD(EspaceToreInt espaceTore,int portRMI,int portAdaptateur) throws RemoteException
    {
        super(portRMI);
        System.out.println("Constructor UnicasRemoteObject : port "+
                           portRMI);

        try{
            this.espaceTore = espaceTore;

            String name = "rmi://localhost:" +
                portAdaptateur +
                "/" +
                NOM_ESPACE_TORE;
            Naming.bind(name,this);
            System.out.println("Bind : "+name+" port "+portAdaptateur);
        }catch(Exception ex){};
    }

    public void addObserver(Remote observer) throws RemoteException
    {
        espaceTore.getObservable().addObserver( new ProxyObserverEspace(observer,(Observable)(espaceTore.getObservable()))  ); // Ajout de l'observable pour delete
    }

    public Point arriver(AgentInt agent,int couleur) throws RemoteException
    {
        try{
            return espaceTore.arriver(agent,couleur);
        }catch(Exception ex){};
        return(null);
    }

    public Point deplacer(int x,int y,int sensX,int sensY,int couleur) throws RemoteException
    {
        try{
            return espaceTore.deplacer(x,y,sensX,sensY,couleur);
        }catch(Exception ex){};
        return(null);
    }

    public int getTempo() throws RemoteException
    {
        try{
            return espaceTore.getTempo();
            }catch(Exception ex){};
        return(200);
    }

    public int getNbX() throws RemoteException
    {
        return espaceTore.getNbX();
    }

    public int getNbY() throws RemoteException
    {
        return espaceTore.getNbY();
    }

    public int getTailleCellule() throws RemoteException
    {
        return espaceTore.getTailleCellule();
    }

    public Vector getPopulation(int couleur) throws RemoteException
    {
        return espaceTore.getPopulation(couleur);
    }

    public CelluleGrille[][] getGrille() throws RemoteException
    {
        return espaceTore.getGrille();
    }

    public Vector getAutrePopulation(int couleur) throws RemoteException
    {
        return espaceTore.getAutrePopulation(couleur);
    }

    public boolean getModeCombat() throws RemoteException
    {
        return espaceTore.getModeCombat();
    }


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

        int portRMI        = params.getInt("port_od",9101);
        int portEspaceTore = params.getInt("port_annuaire",9100);

        System.out.println("Demarrage de l'espace de Tore");

        // Création du service de nommage utilisé par RMI
        try{
            LocateRegistry.createRegistry(portEspaceTore);
            System.out.println("Creation du service de nommage : port "+portEspaceTore);
        } catch(Exception ex){}
        
        ControleurJeu controleurJeu = new ControleurJeu();
        EspaceTore espace = new EspaceTore(controleurJeu);
        IhmControleurJeu ihm = new IhmControleurJeu(controleurJeu,
                                                    espace);

        EspaceToreOD espaceOD = new EspaceToreOD( espace ,portRMI,portEspaceTore);

    }

}