package TP3;

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 TP3.GenererGraphe permet de générer
 * un graphe aléatoire ainsi qu'un graphe de Barabasi Albert
 */
public class GenererGraphe
{
	/**
	 * Génère un graphe aléatoire et ajoute les attributs nécessaires pour l'utilisation des scénarios
	 * @param nbSommet   nombre de sommet du graphe
	 * @param degreMoyen le degré moyen du graphe
	 * @return
	 */
	public static Graph GenererGrapheAleatoire(int nbSommet, double degreMoyen)
	{
		Graph graph = new SingleGraph("Random");
		Generator gen = new RandomGenerator(degreMoyen);
		gen.addSink(graph);
		gen.begin();
		for(int i=0; i<nbSommet; i++)
			gen.nextEvents();

		gen.end();

		System.setProperty("org.graphstream.ui", "swing");
		graph.setAttribute("ui.stylesheet", "url('data/style.css')");

		return graph;
	}

	/**
	 * 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 graph = new SingleGraph("Graphe");

		FileSourceEdge fs = new FileSourceEdge();

		fs.addSink(graph);

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

	/**
	 * Génère un graphe de Barabasi Albert et ajoute les attributs nécessaires pour l'utilisation des scénarios
	 * @param maxLinksPerStep
	 * @param nbSommet nombre de sommet
	 * @return
	 */
	public static Graph genererGrapheBarabasiAlbert(int maxLinksPerStep, int nbSommet)
	{
		Graph grapheAlbert = new SingleGraph("Barabàsi-Albert");
		Generator gen = new BarabasiAlbertGenerator(maxLinksPerStep);
		gen.addSink(grapheAlbert);
		gen.begin();

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

		gen.end();

		return  grapheAlbert;
	}
}
