import ville.Ville;
import ville.EnsembleVille;
import carte.Table;
import carte.Arc;
import carte.GrapheGeometrique;
import carte.GrapheEuclidien;

import java.util.Collection;
import java.util.Vector;

public class Test {

    static Vector<Ville> support;
    static GrapheGeometrique g;

    public static void main (String[] args) {
	initMayotte();
	test3();
    }

    public static void initMayotte(){
	EnsembleVille ens = new EnsembleVille("/users/profs/info/stephane.lengrand/mf.txt");
	g = new GrapheGeometrique();
	for (Ville v : ens.getVilles())
	    g.ajouterVille(v);
	support=new Vector<Ville>(g.sommets());
    }

    public static void test1() {
	EnsembleVille ens = new EnsembleVille("/users/profs/info/stephane.lengrand/mf.txt");
	Table table = new Table();
	for (Ville v : ens.getVilles()){
	    if ( table.contient(v) ) table.ajouterVoisin(v, v.getNom());
	    else table.ajouterVille(v);
	}
	System.out.println(table.taille());
    }
		
    public static void test2() {
	System.out.println("Le graphe est de taille "+g.taille());
	for (int i = 0; i < support.size(); i++) {
	    if (i<10) System.out.println(support.get(i));
	    for (int j = i+1; (j < i+3 && j < support.size()); j++)
		g.ajouterVoisin(support.get(i),new Arc(support.get(i),support.get(j),i));
	// On met la valeur i aux arcs car cette valeur est utilisee par le programe pour determiner la couleur
	// des arcs
	}
	Collection<Arc> voisins = g.voisins(support.get(0)); 
	for (Arc a:voisins)
	    System.out.println(a.origine+" -- "+a.destination);
	MaFenetre f = new MaFenetre();
	f.setGraphe(g);
	// doit lever une exception
	voisins = g.voisins(new Ville("test", 0, 0));
    }

    public static boolean existeArc(Ville s,Ville t){
	for (Arc arc :g.voisins(s))
	    if (arc.destination.equals(t)) return true;
	return false;
    }
    
    public static void test3() {
	g.euclidien(2000);
	// test de reciprocite
	for (Ville s : g.sommets())
	    for (Arc a : g.voisins(s)){
		if (!existeArc(a.destination,s))
		    throw new Error("l'arc "+a+" n'a pas de reciproque");
	    }
	// affichage graphique
	MaFenetre f = new MaFenetre();
	f.setGraphe(g);
    }

    public static void initFrance(){
	EnsembleVille ens = new EnsembleVille("/users/profs/info/stephane.lengrand/fr.txt");
	g = new GrapheGeometrique();
	for (int i = 0; i < ens.size()/30; i++)
	    g.ajouterVille(ens.getVille(i*30));
	support=new Vector<Ville>(g.sommets());
    }

    public static void test4() {
	for (int i = 0; i < support.size()/2; i++)
	    g.ajouterVoisin(support.get(i),new Arc(support.get(i),support.get(i+1),i));
	System.out.println(support.get(0)+ " ---> "+g.terminus(support.get(0)));
	System.out.println(support.get(70)+ " ---> "+g.terminus(support.get(70)));
    }

    public static void test5() {
	g.fusion(support.get(0),support.get(70));
	System.out.println(support.get(0)+ " ---> "+g.terminus(support.get(0)));
	System.out.println(support.get(70)+ " ---> "+g.terminus(support.get(70)));
    }

    public static void test6() {
	g.euclidien(2000);
	GrapheGeometrique g2  = g.composantesConnexes();
	MaFenetre f = new MaFenetre();
	f.setGraphe(g);
	MaFenetre f2 = new MaFenetre();
	f2.setGraphe(g2);
    }

    public static void test7() {
	g.euclidien(21000);
	g.colorieComposantesConnexes();
	MaFenetre f = new MaFenetre();
	f.setGraphe(g);
    }
    
    public static void test8() {
	EnsembleVille ens = new EnsembleVille("/users/profs/info/stephane.lengrand/fr.txt");
	GrapheEuclidien g = new GrapheEuclidien(4000);
	for (Ville v : ens.getVilles())
	    g.ajouterVille(v);
	g.euclidien(4000);
	MaFenetre f = new MaFenetre();
	f.setGraphe(g);
    }

    public static void test9() {
	EnsembleVille ens = new EnsembleVille("/users/profs/info/stephane.lengrand/fr.txt");
	GrapheEuclidien g = new GrapheEuclidien(4000);
	for (Ville v : ens.getVilles())
	    g.ajouterVille(v);
	g.euclidien(4000);
	g.colorieComposantesConnexes();
	MaFenetre f = new MaFenetre();
	f.setGraphe(g);
    }

}

