package biduledres;

import java.util.*;

public class Espace extends Hashtable implements SerialisableXML {
    private int nombreDimensions;
    
    public Espace(int nombreDimensions) {
        this.nombreDimensions = nombreDimensions;
    }
    
    public void setPosition(SommetPrimitif sommetPrimitif, SommetSpatial position) throws ExceptionPositionInvalide {
        if (position.getCoordonnees().length != getNombreDimensions()) 
            throw new ExceptionPositionInvalide(position.getCoordonnees().length, getNombreDimensions());
        put(sommetPrimitif, position);
    }
    
    public SommetSpatial getPosition(SommetPrimitif sommetPrimitif) {
        return (SommetSpatial) get(sommetPrimitif);
    }
    
    public SommetSpatial getPosition(SommetPrimitifPondere sommetPrimitifPondere) {
        return getPosition(sommetPrimitifPondere.getSommetPrimitif());
    }
    
    public SommetSpatial getPosition(Sommet sommet) {
        if (sommet instanceof SommetPrimitif) return getPosition((SommetPrimitif) sommet);
        else if (sommet instanceof SommetPrimitifPondere) return getPosition((SommetPrimitifPondere) sommet);
        else if (sommet instanceof SommetConstruit) return getPosition((SommetConstruit) sommet);
        else return null;
    }
    
    public SommetSpatial getPosition(SommetConstruit sommetConstruit) {
        Iterator iterator = sommetConstruit.getListeSommetPrimitifPondere().iterator();
        int poidsTotal = 0;
        double[] coordonnees = new double[getNombreDimensions()];
        while(iterator.hasNext()) {
            SommetPrimitifPondere sommetPrimitifPondere = (SommetPrimitifPondere) iterator.next();
            SommetSpatial positionSommetPrimitif = getPosition(sommetPrimitifPondere.getSommetPrimitif());
            int poidsSommetPrimitif = sommetPrimitifPondere.getPoids();
            poidsTotal += poidsSommetPrimitif;
            for(int i = 0; i < getNombreDimensions(); i++)
                coordonnees[i] += positionSommetPrimitif.getCoordonnee(i) * poidsSommetPrimitif;
        }
        for(int i = 0; i < getNombreDimensions(); i++)
            coordonnees[i] /= poidsTotal;
        return new SommetSpatial(coordonnees);
    }
    
    public int getNombreDimensions() {
        return nombreDimensions;
    }
    
    public String toXML(int tab) {
        StringBuffer b = new StringBuffer();
        Util.appendTab(b, tab, "<Espace nombreDimensions=\"" + getNombreDimensions() + "\">");
        Enumeration keys = this.keys();
        while(keys.hasMoreElements()) {
            Util.appendTab(b, tab + 1, "<Position>");
            SommetPrimitif sommetPrimitif = (SommetPrimitif) keys.nextElement();
            b.append(sommetPrimitif.toXML(tab + 2));
            SommetSpatial sommetSpatial = (SommetSpatial) this.get(sommetPrimitif);
            b.append(sommetSpatial.toXML(tab + 2));
            Util.appendTab(b, tab + 1, "</Position>");
        }
        Util.appendTab(b, tab, "</Espace>");
        return b.toString();
    }
}