package net.mc_pandacraft.java.plugin.pandacraftutils.config;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
/**
 * Classe chargeant en mémoire un fichier de configuration ou un dossier donné
 * @author Marc Baloup
 *
 */
public abstract class AbstractConfig {
	
	protected PandacraftUtils plugin = PandacraftUtils.getInstance();
	/**
	 * Correspond au dossier de configuration de pandacraftUtils
	 */
	protected File pluginDir = plugin.getDataFolder();
	
	/**
	 * Correspond au dossier ou au fichier de configuration traité par la sous-classe
	 * courante de {@link AbstractConfig}
	 */
	protected File configFile;
	
	/**
	 * @param fileOrDirName le nom du fichier ou du dossier correspondant à la sous-classe de {@link AbstractConfig}
	 * @param isDir <code>true</code> si il s'agit d'un dossier, <code>false</code> sinon
	 * @throws IOException si le fichier est impossible à créer
	 */
	public AbstractConfig(String fileOrDirName, FileType type) throws IOException {
		configFile = new File(pluginDir, fileOrDirName);
		if (type == FileType.DIR)
			configFile.mkdir();
		else
			configFile.createNewFile();
	}
	
	/**
	 * Retourne toutes les lignes d'un fichier donné
	 * @param ignoreEmpty <code>true</code> si on doit ignorer les lignes vides
	 * @param ignoreHashtagComment <code>true</code> si on doit ignorer les lignes commentés (commençant par un #)
	 * @param trimOutput <code>true</code> si on doit appeller la méthode String.trim() sur chaque ligne retournée
	 * @param f le fichier à lire
	 * @return la liste des lignes utiles
	 * @throws IOException
	 */
	protected List<String> getFileLines(boolean ignoreEmpty, boolean ignoreHashtagComment, boolean trimOutput, File f) throws IOException {
		if (!f.isFile())
			return null;
		
		BufferedReader reader = new BufferedReader(new FileReader(f));
		
		List<String> lines = new ArrayList<String>();
		
		String line;
		while ((line = reader.readLine()) != null) {
			String trimmedLine = line.trim();
			
			if (ignoreEmpty && trimmedLine.equals(""))
				continue;
			
			if (ignoreHashtagComment && trimmedLine.startsWith("#"))
				continue;
			
			if (trimOutput)
				lines.add(trimmedLine);
			else
				lines.add(line);
		}
		
		
		reader.close();
		
		return lines;
	}
	
	
	/**
	 * Retourne toutes les lignes du fichier de configuration
	 * @param ignoreEmpty <code>true</code> si on doit ignorer les lignes vides
	 * @param ignoreHashtagComment <code>true</code> si on doit ignorer les lignes commentés (commençant par un #)
	 * @param trimOutput <code>true</code> si on doit appeller la méthode String.trim() sur chaque ligne retournée
	 * @return la liste des lignes utiles
	 * @throws IOException
	 */
	protected List<String> getFileLines(boolean ignoreEmpty, boolean ignoreHashtagComment, boolean trimOutput) throws IOException {
		return getFileLines(ignoreEmpty, ignoreHashtagComment, trimOutput, configFile);
	}
	
	
	
	protected List<File> getFileList() {
		if (!configFile.isDirectory())
			return null;
		
		return Arrays.asList(configFile.listFiles());
	}
	
	
	
	
	
	
	
	
	
	
	protected void warning(String message) {
		plugin.getLogger().warning("Error while loading configuration in '"+configFile.getName()+"' : "+message);
	}
	
	
	
	
	protected enum FileType {
		FILE, DIR
	}
	
}
