package ftp_client;
import java.io.File;
import java.util.ArrayList;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;

// Juste pour alléger le fichier MainWindow.java
public class FormFuncs {
	
	/* TransfertItem Update */
	public static int SLEEP_TIME = 500; // Rafraichir les transferts tous les SLEEP_TIME milli-secondes
	public static ArrayList<TransfertItem> TItoUpdate = new ArrayList<TransfertItem>(); // Liste des elements de transfert a rafraichir (un transfert annule ou termine n'a pas besoin d'etre rafraichi)
	public static void updateAllTransferts(final Shell shell, final Table table){
		if( shell.isDisposed() || TItoUpdate.size() == 0 ) return; // Si la fenetre est pas detruite ou si il y a pas d'elements a rafraichir, quitter
		new Thread(){
			public void run(){
				while(!shell.isDisposed() && TItoUpdate.size()>0){ // Tant que la fenetre n'est pas detruite et qu'il y a des elements a rafraichir
					try {
						Display.getDefault().asyncExec(new Runnable() {
					            public void run() {
					            	try{
					            		for(TransfertItem ti : TItoUpdate)
					            			if(!ti.isDisposed()) ti.updateProgress(); // Rafraichir tous les elements
					            	}catch(Exception e){try {
										Thread.sleep(1000); // Si ca plante, attendre 1 seconde
									} catch (InterruptedException e1) {}}
								}
							}
						);
						// Attendre SLEEP_TIME milli-secondes
						Thread.sleep(SLEEP_TIME);
					} catch (InterruptedException e) {}
				}
			}
		}.start();
	}
	
	/* Add files to a local tree */
	// Remplir l'arbre ou un element avec des fichiers locaux
	public static void addFilesToTree(final Shell shell, final Widget ee, final String path){
		try{
			boolean isRoot = path==null || path.isEmpty(); // Racine si path est vide
			
			// Lister les racines ou les sous-dossiers et fichiers
			File[] listeFichiers;
			if(isRoot) listeFichiers = File.listRoots();
			else listeFichiers = new File(path).listFiles();
			
			// On vide l'element qui va contenir les fichiers
			if(ee instanceof Tree) 			((Tree)ee).removeAll();
	        else if(ee instanceof TreeItem) ((TreeItem)ee).removeAll();
			
			
			// Si il n'y a aucun fichier, le preciser et quitter
			if(listeFichiers==null || listeFichiers.length==0){
		        if(ee instanceof Tree)			new FileTreeItem(shell, (Tree)ee,	  new String[] { "Aucun fichier", "(vide)" });
		        else if(ee instanceof TreeItem) new FileTreeItem(shell, (TreeItem)ee, new String[] { "Aucun fichier", "(vide)" });
		        return;
			}
			
			// Ajouter les dossiers en premier
			for(File f : listeFichiers){
				if(!f.isDirectory()) continue;
				
				TreeItem item = null;
		        if(ee instanceof Tree)			item = new FileTreeItem(shell, (Tree)ee, f, isRoot);
		        else if(ee instanceof TreeItem) item = new FileTreeItem(shell, (TreeItem)ee, f);
		        
		        // Ne pas charger les elements du dossier maintenant
		        new FileTreeItem(shell, item, new String[] { "Chargement..." });
		    }
			
			// Si on ne liste pas les racines, alors on peut ajouter les fichiers
			if(!isRoot)
				for(File f : listeFichiers){
					if(f.isDirectory()) continue;
					if(ee instanceof Tree) 			new FileTreeItem(shell, (Tree)ee, f);
			        else if(ee instanceof TreeItem) new FileTreeItem(shell, (TreeItem)ee, f);
			    }
			
		}catch(Exception e){
			// Si il y a un probleme, effacer tous les elements et indiquer qu'il y a eu une erreur
			
			if(ee instanceof Tree) 			((Tree)ee).removeAll();
	        else if(ee instanceof TreeItem) ((TreeItem)ee).removeAll();
			
		    if(ee instanceof Tree)			new FileTreeItem(shell, (Tree)ee,	  new String[] {  "Impossible de lister les fichiers", "(erreur)" });
		    else if(ee instanceof TreeItem) new FileTreeItem(shell, (TreeItem)ee, new String[] {  "Impossible de lister les fichiers", "(erreur)" });
		}
	}
	
	/* Add files to a remote tree */
	// Remplir l'arbre ou un element avec des fichiers distants
	public static void addFTPFilesToTree(final Shell shell, final Widget ee, final ArrayList<FTPFile> fe){
		// Meme principe que pour les fichiers locaux excepte qu'on a deja la liste des fichiers distants en parametre et qu'il n'y a pas de racine
		if(ee instanceof Tree) 			((Tree)ee).removeAll();
        else if(ee instanceof TreeItem) ((TreeItem)ee).removeAll();
				
		if(fe==null || fe.isEmpty()){
			if(ee instanceof Tree)			new FileTreeItem(shell, (Tree)ee, 		new String[] { "Aucun fichier", "(vide)" });
	        else if(ee instanceof TreeItem) new FileTreeItem(shell, (TreeItem)ee, 	new String[] { "Aucun fichier", "(vide)" });
	        return;
		}
		
		for(FTPFile f : fe){
			if(!f.isDirectory()) continue;
			
			TreeItem item = null;
	        if(ee instanceof Tree) item = new FileTreeItem(shell, (Tree)ee, f);
	        else if(ee instanceof TreeItem) item = new FileTreeItem(shell, (TreeItem)ee, f);
	        	        
	        new FileTreeItem(shell, item, new String[] { "Chargement..." });
	    }
		
		for(FTPFile f : fe){
			if(f.isDirectory()) continue;
			
	        if(ee instanceof Tree) 			new FileTreeItem(shell, (Tree)ee, f);
	        else if(ee instanceof TreeItem) new FileTreeItem(shell, (TreeItem)ee, f);
	    }
		
	}

}
