package biduledres;

import java.util.*;

public class SommetConstruit extends Sommet {
    private ListeSommetPrimitifPondere liste;

    public SommetConstruit(SommetPrimitif s) {
        this(new SommetPrimitifPondere(s));
    }

    public SommetConstruit(SommetPrimitifPondere s) {
        this(new ListeSommetPrimitifPondere(s));
    }

    public SommetConstruit(ListeSommetPrimitifPondere liste) {
        this.liste = liste;
    }
    public ListeSommetPrimitifPondere getListeSommetPrimitifPondere() {
        return liste;
    }

    public ListeSommetPrimitif getListeSommetPrimitif() {
        return liste.getListeSommetPrimitif();
    }

    public boolean equals(Object o) {
        if (o instanceof SommetConstruit) {
            return ((SommetConstruit) o).getListeSommetPrimitifPondere().equals(getListeSommetPrimitifPondere());
        }
        return false;
    }

    public SommetPrimitifPondere getSommetPrimitifPondere(SommetPrimitif sommetPrimitif) {
        Iterator i = getListeSommetPrimitifPondere().iterator();
        while(i.hasNext()) {
            SommetPrimitifPondere s = (SommetPrimitifPondere) i.next();
            if (s.getSommetPrimitif().equals(sommetPrimitif)) return s;
        }
        return new SommetPrimitifPondere(sommetPrimitif, 0);
    }

    public int getPoids(SommetPrimitif sommetPrimitif) {
        return getSommetPrimitifPondere(sommetPrimitif).getPoids();
    }

    public SommetConstruit getIsobarycentre(Sommet autreSommet) {
        if (autreSommet instanceof SommetConstruit) return getIsobarycentre((SommetConstruit) autreSommet);
        else if (autreSommet instanceof SommetPrimitifPondere) return getIsobarycentre((SommetPrimitifPondere) autreSommet);
        else if (autreSommet instanceof SommetPrimitif) return getIsobarycentre((SommetPrimitif) autreSommet);
        return null;
    }

    public SommetConstruit getIsobarycentre(SommetPrimitifPondere autreSommet) {
        return getIsobarycentre(new SommetConstruit(autreSommet));
    }

    public SommetConstruit getIsobarycentre(SommetPrimitif autreSommet) {
        return getIsobarycentre(new SommetConstruit(autreSommet));
    }

    public SommetConstruit getIsobarycentre(SommetConstruit autreSommet) {
        ListeSommetPrimitifPondere listeRetour = new ListeSommetPrimitifPondere();
        ListeSommetPrimitif listeUnion = getListeSommetPrimitif();
        listeUnion.addAll(autreSommet.getListeSommetPrimitif());
        Iterator i = listeUnion.iterator();
        while(i.hasNext()) {
            SommetPrimitif s = (SommetPrimitif) i.next();
            listeRetour.add(new SommetPrimitifPondere(s, getPoids(s) + autreSommet.getPoids(s)));
        }
        return new SommetConstruit(listeRetour);
    }

    public String toXML(int tab) {
        return Util.toXMLListe(tab, "SommetConstruit", getListeSommetPrimitifPondere().iterator());
    }
}
