/*
 * Projet : Trustopics
 * Version : 0.2.1
 * Fichier : TopicsUpdates.java
 */

import java.util.ArrayList;
import java.util.Date;
import java.util.TimerTask;

public class TopicsUpdates extends TimerTask {

	private double glb_startTime;
	private double glb_elpasedTime;
	private ArrayList glb_arrayList;
	private TopicsTextPane glb_topicsTextPane;

	public class TopicDatasStruct {
		public boolean isOk;
		public String state;
		public String categorie;
		public String value;
		public String message;
		public String currentAnswer;
		public String newAnswer;
		public String view;
		public String author;
		public String authorAnswer;
	}
	
	public TopicsUpdates(TopicsTextPane prm_roundTextPane) {
		glb_topicsTextPane = prm_roundTextPane;
	}
	
	public void run() {
		if (Defines.selectTopicIsInProgress) return;
		Logs lcl_logs = new Logs();
		lcl_logs.Clear();
		lcl_logs.AddTab(0);
		lcl_logs.Add("Mise à jour des topics. (" + new Date() + ")");
		lcl_logs.AddLine("~");
		while(true) { if (!Defines.eventMouseIsActivated) break; }
		int lcl_topicNb;
		ConfigTopicsUpdates lcl_ctu;
		lcl_ctu = new ConfigTopicsUpdates();
		lcl_ctu.LoadTopicsDatas();
		lcl_topicNb = lcl_ctu.GetTotalTopic();
		if (lcl_topicNb <= 0) return;
		int lcl_topicsTt = 0;
		Defines.elpasedTime = 0;
		Defines.filesDownload = 0;
		glb_startTime = System.currentTimeMillis();
		Defines.topicsUpdateIsInProgress = true;
		glb_topicsTextPane.UpdateList();
		String[] lcl_topicsDatasFile = new String[lcl_ctu.GetMaxTopicDatas()];
		glb_arrayList = new ArrayList();
		for (int i = 0 ; i < lcl_topicNb ; i++) {
			lcl_topicsDatasFile = lcl_ctu.GetTopicDatas(i + 1);
			TopicDatasStruct lcl_tds = new TopicDatasStruct();
			lcl_tds.isOk = false;
			lcl_tds.state = lcl_topicsDatasFile[0]; 
			lcl_tds.categorie = lcl_topicsDatasFile[1]; 
			lcl_tds.value = lcl_topicsDatasFile[2]; 
			lcl_tds.message = lcl_topicsDatasFile[3]; 
			lcl_tds.currentAnswer = lcl_topicsDatasFile[4]; 
			lcl_tds.newAnswer = "0";
			lcl_tds.view = lcl_topicsDatasFile[5];
			lcl_tds.author = lcl_topicsDatasFile[6];
			lcl_tds.authorAnswer = lcl_topicsDatasFile[7];
			glb_arrayList.add(lcl_tds);
		}
		String lcl_temp;
		boolean lcl_topicsExist = false;
		boolean lcl_categoriePageIsOk = false;
		WebMemory lcl_wm = new WebMemory();
		TopicDatasStruct lcl_tds = new TopicDatasStruct();
		for (int bcl_categorie = 0 ; bcl_categorie < new WebMemory().GetCategoriesSize() ; bcl_categorie ++) {
			for (int bcl_pageNb = 0 ; bcl_pageNb < (Defines.MaxPage + 1) ; bcl_pageNb ++) {
				for (int bcl_topicNbLocal = 0 ; bcl_topicNbLocal < lcl_topicNb ; bcl_topicNbLocal ++) {
					lcl_tds = (TopicDatasStruct)glb_arrayList.get(bcl_topicNbLocal);
					if (lcl_tds.categorie.equals(String.valueOf(bcl_categorie)) && !lcl_tds.isOk && !lcl_categoriePageIsOk) {
						lcl_categoriePageIsOk = true;
						new WebWaitExtra().Start();
						lcl_wm.UpdateTopics((Integer.parseInt(lcl_tds.categorie) + 1),(bcl_pageNb + 1));
						new WebWaitExtra().Stop();
						lcl_logs.AddTab(1);
						lcl_logs.AddEmpty();
						lcl_logs.Add("Lecture [Catégorie/Page] : " + new WebMemory().GetCategories(Integer.parseInt(lcl_tds.categorie)) + " / " + (bcl_pageNb + 1));
						lcl_logs.AddLine("-");
						lcl_logs.AddTab(2);
						lcl_logs.AddEmpty();
						lcl_logs.Add(">> Données recueillies : ");
						lcl_logs.Add("[Message/Identifiant/Nombre réponse/Nombre vue/Auteur topic/Auteur Message]");
						lcl_logs.AddEmpty();
						for (int i = 0 ; i < lcl_wm.GetTopicsAnswersSize() ; i++) {
							lcl_temp = lcl_wm.GetTopicMessage(i) + " / ";
							lcl_temp += lcl_wm.GetTopicValue(i) + " / ";
							lcl_temp += lcl_wm.GetTopicAnswer(i) + " / ";
							lcl_temp += lcl_wm.GetTopicView(i) + " / ";
							lcl_temp += lcl_wm.GetTopicAuthor(i) + " / ";
							lcl_temp += lcl_wm.GetTopicAuthorAnswer(i);
							lcl_logs.Add(lcl_temp);
						}
						lcl_logs.AddTab(3);
						lcl_logs.AddEmpty();
						lcl_logs.Add(">> Topics traités : ");
					}
					if (lcl_categoriePageIsOk) {
						for (int bcl_memoryResult = 0 ; bcl_memoryResult < lcl_wm.GetTopicsValuesSize() ; bcl_memoryResult ++) {
							if (lcl_tds.value.equals(lcl_wm.GetTopicValue(bcl_memoryResult))) {
								lcl_tds.isOk = true;
								lcl_tds.newAnswer = lcl_wm.GetTopicAnswer(bcl_memoryResult);
								lcl_tds.view = lcl_wm.GetTopicView(bcl_memoryResult);
								lcl_tds.authorAnswer = lcl_wm.GetTopicAuthorAnswer(bcl_memoryResult);
								if (lcl_tds.state.equals("0")) {
									lcl_tds.state = "1";
									lcl_ctu.ChangeTopicData(lcl_topicsDatasFile,0,lcl_tds.state);
								}
								lcl_logs.AddEmpty();
								lcl_logs.Add("Le topic a été traité : " + lcl_tds.isOk);
								lcl_logs.Add("L'état du topic [0,1,>1] : " + lcl_tds.state);
								lcl_logs.Add("Indice categorie : " + lcl_tds.categorie);
								lcl_logs.Add("Identifiant : " + lcl_tds.value);
								lcl_logs.Add("Message : " + lcl_tds.message);
								lcl_logs.Add("Nombre de réponse avant mise à jour : " + lcl_tds.currentAnswer);
								lcl_logs.Add("Nombre de réponse aprés mise à jour : " + lcl_tds.newAnswer);
								lcl_logs.Add("Nombre de vue : " + lcl_tds.view);
								lcl_logs.Add("Auteur du Topic : " + lcl_tds.author);
								lcl_logs.Add("Auteur du dernier message : " + lcl_tds.authorAnswer);
								lcl_logs.Add("Nombre de nouveau message : >> " + (Integer.parseInt(lcl_tds.newAnswer) - Integer.parseInt(lcl_tds.currentAnswer)) + " <<");
								lcl_topicsTt ++;
								lcl_topicsExist = true;
								break;
							}
						}
					}
				}
				if (!lcl_topicsExist && lcl_categoriePageIsOk) {
					lcl_logs.AddTab(3);
					lcl_logs.AddEmpty();
					lcl_logs.Add("Aucun");
				}
				lcl_categoriePageIsOk = false;
				lcl_topicsExist = false;
			}
		}
		lcl_logs.AddTab(1);
		lcl_logs.AddEmpty();
		lcl_logs.Add("Topics non traités");
		lcl_logs.AddLine("-");
		lcl_logs.AddTab(2);
		lcl_topicsExist = false;
		for (int i = 0 ; i < glb_arrayList.size() ; i++) {
			lcl_tds = (TopicDatasStruct)glb_arrayList.get(i);
			lcl_topicsDatasFile = lcl_ctu.GetTopicDatas(i + 1);
			if (!lcl_tds.isOk) {
				lcl_ctu.ChangeTopicData(lcl_topicsDatasFile,0,"0");
				lcl_logs.AddEmpty();
				lcl_logs.Add("Le topic a été traité : " + lcl_tds.isOk);
				lcl_logs.Add("L'état du topic [0,1,>1] : " + "0");
				lcl_logs.Add("Indice categorie : " + lcl_tds.categorie + " ( " + new WebMemory().GetCategories(Integer.parseInt(lcl_tds.categorie)) + " )");
				lcl_logs.Add("Identifiant : " + lcl_tds.value);
				lcl_logs.Add("Message : " + lcl_tds.message);
				lcl_logs.Add("Nombre de réponse : " + lcl_tds.currentAnswer);
				lcl_logs.Add("Nombre de vue : " + lcl_tds.view);
				lcl_logs.Add("Auteur du Topic : " + lcl_tds.author);
				lcl_logs.Add("Auteur du dernier message : " + lcl_tds.authorAnswer);
				lcl_topicsExist = true;
			}
			else {
				int lcl_newAnswer = Integer.parseInt(lcl_tds.newAnswer) - Integer.parseInt(lcl_tds.currentAnswer);
				int lcl_state = Integer.parseInt(lcl_tds.state);
				if (lcl_newAnswer > 0 && lcl_state >= 1) {
					lcl_state += lcl_newAnswer;
					lcl_ctu.ChangeTopicData(lcl_topicsDatasFile,0,String.valueOf(lcl_state));
					lcl_ctu.ChangeTopicData(lcl_topicsDatasFile,4,lcl_tds.newAnswer);
				}
				lcl_ctu.ChangeTopicData(lcl_topicsDatasFile,5,lcl_tds.view);
				lcl_ctu.ChangeTopicData(lcl_topicsDatasFile,7,lcl_tds.authorAnswer);
			}
		}
		if (!lcl_topicsExist) {
			lcl_logs.AddEmpty();
			lcl_logs.Add("Aucun");
		}
		lcl_ctu.SaveTopicsDatas();
		glb_topicsTextPane.LoadTopics();
		Defines.topicsUpdateIsInProgress = false;
		glb_topicsTextPane.UpdateList();
		glb_elpasedTime = System.currentTimeMillis() - glb_startTime;
		lcl_logs.AddTab(1);
		lcl_logs.AddEmpty();
		lcl_logs.Add("Infos sur la mise à jour.");
		lcl_logs.AddLine("-");
		lcl_logs.AddEmpty();
		lcl_logs.AddTab(2);
		lcl_logs.Add("Durée de la mise à jour : " + (glb_elpasedTime / 1000) + " secondes");
		lcl_logs.Add("Nombre de fichiers téléchargés : " + Defines.filesDownload);
		lcl_logs.Add("Temps de téléchargement des fichiers : " + (Defines.elpasedTime / 1000) + " secondes");
		lcl_logs.Add("Topics traités : " + lcl_topicsTt + "/" + lcl_topicNb);
		lcl_logs.Add("Fichiers téléchargés / Nombre de topics : " + (float)Defines.filesDownload/(float)lcl_topicNb + " (<= 1)");
	}
}