package TP2;

import java.io.File;
import java.io.FileWriter;
/**
 * La classe TP2.CreationFichier permet de créer les fichiers nécessaires à la création des fichiers graphe.png
 * Les fichiers créés:
 * - fichier .dat
 * - fichier .gnuplot
 * - fichier png
 */
public class CreationFichier
{
	/**
	 * Méthode qui permet de créer les fichiers Resultat.dat
	 * @param tabResultat les données
	 * @param nomFichier nom du fichier que nous allons créer
	 */
	public static void creerFichier(double[] tabResultat, String nomFichier)
	{
		CreationFichier.verificationDossier();
		try {
			File f = new File("./data/" + nomFichier + ".dat");
			FileWriter writer = new FileWriter(f);
			for (int i = 1; i < tabResultat.length; i++)
				writer.write(i + " " + tabResultat[i] + "\n");

			writer.close();

		} catch (Exception e) {
			System.out.println(e);
		}
	}


	/**
	 * Méthode qui permet de créer les graphes en échelle linéaire
	 * @param nomFichier nom du fichier que nous allons créer
	 * @param fichierResultat nom du fichier ayant les données
	 */
	public static void creerGrapheLineaire(String nomFichier, String fichierResultat)
	{
		CreationFichier.verificationDossier();
		try {
			File f = new File("./gnuplot/" + nomFichier+ ".gnuplot");
			FileWriter writer = new FileWriter(f);
			writer.write(
					"set terminal png\n" +
							"set title \"Distribution des degrés\"\n" +
							"set xlabel 'k'\n" +
							"set ylabel 'p(k)'\n" +
							"set output './graphes/"+nomFichier+".png'\n" +
							"plot './data/"+ fichierResultat+".dat' title 'Distribution des degrés' with linesp lt 2 pt 2 lc 2"
			);
			writer.close();
		} catch (Exception e) {
			System.out.println(e);
		}

		try {
			Runtime commandPrompt = Runtime.getRuntime();
			commandPrompt.exec("gnuplot ./gnuplot/"+nomFichier+".gnuplot");
		} catch (Exception e) {
			System.out.println(e);
		}
	}

	/**
	 * Méthode qui permet de créer les graphes en échelle Log-Log
	 * @param nomFichier nom du fichier que nous allons créer
	 * @param fichierResultat nom du fichier ayant les données
	 */
	public static void creerGrapheLogLog(String nomFichier, String fichierResultat)
	{
		CreationFichier.verificationDossier();
		try {
			File f = new File("./gnuplot/"+nomFichier+".gnuplot");
			FileWriter writer = new FileWriter(f);
			writer.write(
					"set terminal png\n" +
							"set title \"Distribution des degrés\"\n" +
							"set xlabel 'k'\n" +
							"set ylabel 'p(k)'\n" +
							"set output './graphes/"+nomFichier+".png'\n" +
							"set logscale xy\n" +
							"set yrange [1e-6:1]\n" +
							"plot './data/"+fichierResultat+".dat' title 'Distribution des degrés' with linesp lt 2 pt 2 lc 2"
			);
			writer.close();
		} catch (Exception e) {
			System.out.println(e);
		}

		try {
			Runtime commandPrompt = Runtime.getRuntime();
			commandPrompt.exec("gnuplot ./gnuplot/"+nomFichier+".gnuplot");
		} catch (Exception e) {
			System.out.println(e);
		}
	}

	/**
	 * Méthode qui permet de créer les graphes de distribution de Poisson
	 * @param nomFichier nom du fichier que nous allons créer
	 * @param fichierResultat nom du fichier ayant les données
	 */
	public static void creerGraphePoisson(String nomFichier, String fichierResultat)
	{
		CreationFichier.verificationDossier();

		try {
			File f = new File("./gnuplot/poisson/"+nomFichier+".gnuplot");
			FileWriter writer = new FileWriter(f);
			writer.write(
					"set terminal png\n" +
							"set title \"Distribution des degrés\"\n" +
							"set xlabel 'k'\n" +
							"set ylabel 'p(k)'\n" +
							"set output './graphes/poisson/"+nomFichier+".png'\n" +
							"set logscale xy\n" +
							"set yrange [1e-6:1]\n" +
							"# Poisson\n" +
							"lambda = 6.62208890914917\n" +
							"poisson(k) = lambda ** k * exp(-lambda) / gamma(k + 1)\n" +
							"\n" +
							"# on va fitter une fonction linéaire en log-log\n" +
							"\n" +
							"f(x) = lc - gamma * x\n" +
							"fit f(x) './data/"+fichierResultat+".dat' using (log($1)):(log($2)) via lc, gamma\n" +
							"c = exp(lc)\n" +
							"power(k) = c * k ** (-gamma)\n" +
							"plot './data/"+fichierResultat+".dat' title 'DBLP', \\\n" +
							"poisson(x) title 'Loi de poisson', \\\n" +
							"power(x) title 'Loi de puissance'\n"
			);
			writer.close();
		} catch (Exception e) {
			System.out.println(e);
		}

		try {
			Runtime commandPrompt = Runtime.getRuntime();
			commandPrompt.exec("gnuplot ./gnuplot/poisson/"+nomFichier+".gnuplot");
		} catch (Exception e) {
			System.out.println(e);
		}
	}

	/**
	 * Méthode qui permet de créer les graphes des distributions des distances
	 * et de créer le grahes ensuite
	 * @param tabResultat les données
	 * @param nomFichier  nom du fichier que nous allons créer
	 */
	public static void creerGrapheDistance(double[] tabResultat, String  nomFichier)
	{
		CreationFichier.verificationDossier();

		try {
			File f = new File("./data/distance/Resultat"+nomFichier+".dat");
			FileWriter writer = new FileWriter(f);
			for (int i = 1; i < tabResultat.length; i++)
				writer.write(i + " " + tabResultat[i] + "\n");

			writer.close();

		} catch (Exception e) {
			System.out.println(e);
		}


		try {
			File f = new File("./gnuplot/distance/"+nomFichier+".gnuplot");
			FileWriter writer = new FileWriter(f);
			writer.write(
					"set terminal png\n" +
							"set title \"Distribution des distances\"\n" +
							"set xlabel 'k'\n" +
							"set ylabel 'p(k)'\n" +
							"set output './graphes/distance/"+nomFichier+".png'\n" +
							"plot './data/distance/Resultat"+nomFichier+".dat' title 'Distribution des distances' with linesp lt 2 pt 2 lc 2"
			);
			writer.close();
		} catch (Exception e) {
			System.out.println(e);
		}

		try {
			Runtime commandPrompt = Runtime.getRuntime();
			commandPrompt.exec("gnuplot ./gnuplot/distance/"+nomFichier+".gnuplot");
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	/**
	 * Méthode qui permet de créer les dossiers
	 */
	private static void verificationDossier()
	{

		File dossier = new File("./gnuplot");
		if(!dossier.exists())
			dossier.mkdir();

		dossier = new File("./graphes");
		if(!dossier.exists())
			dossier.mkdir();

		dossier = new File("./gnuplot/distance");
		if (!dossier.exists())
			dossier.mkdir();

		dossier = new File("./graphes/distance");
		if (!dossier.exists())
			dossier.mkdir();

		dossier = new File("./data/distance");
		if (!dossier.exists())
			dossier.mkdir();
		dossier = new File("./gnuplot/poisson");
		if (!dossier.exists())
			dossier.mkdir();

		dossier = new File("./graphes/poisson");
		if (!dossier.exists())
			dossier.mkdir();
		}
}
