import org.graphstream.algorithm.generator.BarabasiAlbertGenerator;
import org.graphstream.algorithm.generator.Generator;
import org.graphstream.algorithm.generator.RandomGenerator;
import org.graphstream.graph.Graph;
import org.graphstream.graph.implementations.SingleGraph;
import org.graphstream.stream.file.FileSourceEdge;

import java.io.IOException;

/**
 * La classe GenererGraphe permet de générer les 3 graphes:
 * - un avec le fichier
 * - en utilisant Barabasi Albert
 * - en générant aléatoirement
 */
public class GenererGraphe
{

	/**
	 * Méthode qui crée le graphe utilisant un fichier
	 * @param nomFichier nom du fichier qui se trouve dans le dossier ".data"
	 * @return le graphe crée
	 */
	public static Graph genererGrapheFichier(String nomFichier)
	{
		Graph graphe = new SingleGraph("Graphe");

		FileSourceEdge fs = new FileSourceEdge();

		fs.addSink(graphe);

		try {
			fs.readAll("data/"+nomFichier);
		} catch (IOException e) {
			System.out.println("Fichier non trouvé");
		} finally {
			fs.removeSink(graphe);
		}
		return graphe;
	}

	/**
	 * Méthode qui crée le graphe utilisant la méthode d'attachement préférentiel (Barabasi-Albert)
	 * @param maxLinksPerStep le maximum de lien
	 * @param nbNoeud nombre de noeud
	 * @return  le graphe crée
	 */
	public static Graph genererGrapheBarabasiAlbert(int maxLinksPerStep, int nbNoeud)
	{
		Graph grapheAlbert = new SingleGraph("Barabàsi-Albert");
		Generator gen = new BarabasiAlbertGenerator(maxLinksPerStep);
		gen.addSink(grapheAlbert);
		gen.begin();

		for(int i=0; i<nbNoeud; i++) {
			gen.nextEvents();
		}

		gen.end();
		return  grapheAlbert;
	}

	/**
	 * Méthode qui crée un graphe aléatoire
	 * @param averageDegree le degré moyen du graphe
	 * @param nbNoeud nombre de noeud
	 * @return  le graphe crée
	 */
	public static Graph genererAleatoire(double averageDegree, int nbNoeud)
	{
		Graph grapheAleatoire = new SingleGraph("Graphe Aléatoire");
		Generator gen = new RandomGenerator(averageDegree);
		gen.addSink(grapheAleatoire);
		gen.begin();
		for(int i=0; i<nbNoeud; i++)
			gen.nextEvents();
		gen.end();
		return grapheAleatoire;
	}



}
