import java.util.Collection;
import java.util.LinkedList;

import points.Drawable;
import points.DrawableNamedPoint;
import points.NamedPoint;
import points.SimpleNamedPoint;

public class Test {

  static void test1() {
    SimpleNamedPoint top = new SimpleNamedPoint("top", 100, 20);
    System.out.println(top);
    System.out.println(new SimpleNamedPoint("left", 20, 100));
    System.out.println(new SimpleNamedPoint("right", 150, 100));
  }

  static void printNames(Collection<? extends NamedPoint> c) {
    System.out.println(c.size() + " point(s) :");
    for (NamedPoint p : c)
      System.out.println(p.getName());
  }

  static void test2() {
    Collection<NamedPoint> myCollection = new LinkedList<NamedPoint>();
    // autres possibles :
    // Collection<NamedPoint> myCollection = new ArrayList<NamedPoint>();
    // Collection<NamedPoint> myCollection = new Vector<NamedPoint>();
    // Collection<NamedPoint> myCollection = new Stack<NamedPoint>();
    // Collection<NamedPoint> myCollection = new HashSet<NamedPoint>(); //
    // l'ordre n'est pas conservé
    // Collection<NamedPoint> myCollection = new LinkedHashSet<NamedPoint>(); //
    // l'ordre est conservé
    SimpleNamedPoint top = new SimpleNamedPoint("top", 100, 20);
    SimpleNamedPoint left = new SimpleNamedPoint("left", 20, 100);
    SimpleNamedPoint right = new SimpleNamedPoint("right", 150, 100);
    myCollection.add(top);
    myCollection.add(left);
    myCollection.add(right);
    printNames(myCollection);
  }

  static void test3() {
    Collection<DrawableNamedPoint> myCollection = new LinkedList<DrawableNamedPoint>();
    SimpleNamedPoint top = new SimpleNamedPoint("top", 100, 20);
    SimpleNamedPoint left = new SimpleNamedPoint("left", 20, 100);
    SimpleNamedPoint right = new SimpleNamedPoint("right", 150, 100);
    myCollection.add(top);
    myCollection.add(left);
    myCollection.add(right);
    printNames(myCollection);
    Collection<Drawable> anOtherCollection = new LinkedList<Drawable>();
    for (Drawable p : myCollection)
      anOtherCollection.add(p);
    new Drawing(anOtherCollection);
    // new Drawing(new LinkedList<Drawable>(maCollection));
  }

  static SimpleNamedPoint barycenter(Collection<? extends NamedPoint> c, String name) {
    int x = 0;
    int y = 0;
    int n = 0;
    for (NamedPoint p : c) {
      x += p.getX();
      y += p.getY();
      ++n;
    }
    if (n > 0)
      return new SimpleNamedPoint(name, x / n, y / n);
    else
      return null;
  }

  static NamedPoint search(String name, Collection<? extends NamedPoint> c) {
    for (NamedPoint p : c)
      if (name.equals(p.getName()))
        return p;
    return null;
  }

  static void test4() {
    Collection<DrawableNamedPoint> myCollection = new LinkedList<DrawableNamedPoint>();
    SimpleNamedPoint top = new SimpleNamedPoint("top", 100, 20);
    SimpleNamedPoint left = new SimpleNamedPoint("left", 20, 100);
    SimpleNamedPoint right = new SimpleNamedPoint("right", 150, 100);
    myCollection.add(top);
    myCollection.add(left);
    myCollection.add(right);
    myCollection.add(barycenter(myCollection,"middle"));
    System.out.println(search("left", myCollection));
    printNames(myCollection);
    new Drawing(new LinkedList<Drawable>(myCollection));
  }

  public static void main(String[] args) {
    // test1();
    // test2();
    // test3();
    test4();
  }
}

