package net.mc_pandacraft.java.plugin.pandacraftutils;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;

/*
 * Configuration du plugin
 */
public class ConfigManager {
	private static ConfigManager instance = null;
	
	public synchronized static ConfigManager getInstance() {
		
		if (instance == null)
			try {
				instance = new ConfigManager();
			} catch (Exception e) {
				PandacraftUtils.getInstance().getLogger().severe("Erreur de chargement de la configuration de PandacraftUtils");
				e.printStackTrace();
			}
		
		return instance;
	}
	
	public synchronized static void reloadConfig() {
		if (instance != null)
			PandacraftUtils.getInstance().reloadConfig();
		instance = null;
	}
	
	private PandacraftUtils plugin = PandacraftUtils.getInstance();
	
	private ConfigManager() throws Exception {
		
		// dossier de configuration principale
		File configDir = plugin.getDataFolder();
		configDir.mkdir();
		
		// dossier qui doit contenir les messages automatiques
		File autoMessagesDir = new File(configDir, "automessages");
		autoMessagesDir.mkdir();

		// dossier qui doit contenir les alias de commandes
		File commandAliasDir = new File(configDir, "commandalias");
		commandAliasDir.mkdir();

		// dossier qui doit contenir les séries de commandes
		File multiCommandsDir = new File(configDir, "multicommands");
		multiCommandsDir.mkdir();
		
		// fichier qui doit contenir les insultes à censurer
		File badWordsFile = new File(configDir, "badwords.txt");
		badWordsFile.createNewFile();
		
		plugin.saveDefaultConfig();
		FileConfiguration configFile = plugin.getConfig();
		
		
		Database_host = configFile.getString("database.host");
		Database_port = configFile.getInt("database.port");
		Database_database = configFile.getString("database.base");
		Database_username = configFile.getString("database.user");
		Database_password = configFile.getString("database.pass");
		
		AFK_timeoutAutoAfkMessage = configFile.getInt("afk.timeoutAutoMessage");
		AFK_timeoutAutoAfkKick = configFile.getInt("afk.timeoutAutoKick");
		
		

		ChatAnalysis_timeBeforeResendSameMessage = configFile.getLong("chatAnalysis.timeBeforeResendSameMessage");
		ChatAnalysis_timeBeforeResendSameCommand = configFile.getLong("chatAnalysis.timeBeforeResendSameCommand");
		ChatAnalysis_timePerCaracterForNewMessage = configFile.getLong("chatAnalysis.timePerCaracterForNewMessage");
		ChatAnalysis_maxViolationLevel = configFile.getInt("chatAnalysis.maxViolationLevel");
		ChatAnalysis_nbSecondForOneVLDown = configFile.getInt("chatAnalysis.nbSecondForOneVLDown");
		
		CuboCommand_worlds = Arrays.asList(configFile.getString("cubos.worlds").split(";"));
		
		UsersCleaner_users_cleaner_group = configFile.getString("cleaner.users_cleaner_group");
		
		// TODO ajouter les valeurs par défaut dans config.yml
		Automessage_interval_players = configFile.getInt("autoMessage.interval_player", 10*60);
		Automessage_interval_default = configFile.getInt("autoMessage.interval_default", 2*60+30);
		

		// TODO ajouter les valeurs par défaut dans config.yml
		// TODO gérer les codes de coloration;
		ServerMessages_defaultColor = ChatColor.YELLOW.toString();
		ServerMessages_prefix = ChatColor.YELLOW+"["+ChatColor.WHITE+"Pandacraft"+ChatColor.YELLOW+"] "; //configFile.getString("server_messages_prefix");
		

		// TODO ajouter les valeurs par défaut dans config.yml
		// TODO gérer les codes de coloration;
		ServerMOTD = "§7Serveur §fPandacraft§7, §eVenez nous rejoindre :D\n§bCreatif§7, §6Survie§7 et §4Faction/PVP§7 !";
		
		

		// TODO ajouter les valeurs par défaut dans config.yml
		EntitySpam_worlds = "creative"; // séparé avec des point-virgules
		EntitySpam_limitPerChunks = 50;
		

		// TODO ajouter les valeurs par défaut dans config.yml
		NetworkAPI_passwd = "rgrgaethejtrvvzh47";
		
		
		
		initChatAnalysisBadWord();
		initCommandAlias();
		initAutomessages();
	}
	
	
	
	/*
	 * Connexion à la base de donnée
	 */
	
	public String Database_host;
	public int Database_port;
	public String Database_username;
	public String Database_database;
	public String Database_password;
	
	
	
	
	
	
	
	
	/*
	 * Users cleaner
	 */
	public String UsersCleaner_users_cleaner_group;
	
	
	
	/*
	 * Entity Spam
	 */
	public String EntitySpam_worlds;
	public int EntitySpam_limitPerChunks;
	
	
	
	
	
	/*
	 * NetworkAPI
	 */
	public String NetworkAPI_passwd;
	
	
	
	
	
	
	
	
	
	/*
	 * Automessages
	 */
	public List<Map<String, String>> Automessages_messages;
	/**
	 * En seconde : pour les joueurs != visiteur
	 */
	public int Automessage_interval_players;
	/**
	 * En seconde : pour les visiteurs
	 */
	public int Automessage_interval_default;
	
	private void initAutomessages() {
		Automessages_messages = new ArrayList<Map<String,String>>();
		
		
		Map<String, String> message;
		
		message = new HashMap<String, String>();
		message.put("message", ChatColor.BLUE+"Bienvenue sur Pandacraft ! :) Pour pouvoir jouer, n'oubliez pas de vous inscrire en cliquant sur le lien en dessous%n    &ahttps://www.mc-pandacraft.net/?p=inscription");
		message.put("permissions", "group.default");
		Automessages_messages.add(message);
		
		message = new HashMap<String, String>();
		message.put("message", "Utilisez la commande &7/cubo"+ServerMessages_defaultColor+" en Survie pour protéger vos construction ! :)%n&a https://www.mc-pandacraft.net/?p=antigrief#tuto_cubo");
		message.put("permissions", "*");
		Automessages_messages.add(message);
		
		message = new HashMap<String, String>();
		message.put("message", "WorldEdit disponible en &bCréatif"+ServerMessages_defaultColor+" avec le grade %n&f[&eUltimate&f]"+ServerMessages_defaultColor+". Profitez en vite :D%n          &a https://www.mc-pandacraft.net/?p=ultimate");
		message.put("permissions", "*");
		Automessages_messages.add(message);

		message = new HashMap<String, String>();
		message.put("message", "Launcher disponible pour Pandacraft : Optifine intégré et mise à jour automatique avec le serveur.%n        &ahttps://www.mc-pandacraft.net/?p=launcher");
		message.put("permissions", "*");
		Automessages_messages.add(message);
		/*
		 * Fonctionnement :
		 * Chaque joueur a une variable indiquand la date/heure du dernier message affiché
		 * Cette valeur est initialisé à la valeur courante, lors de chaque connexion du joueur
		 * Selon le grade, l'intervalle entre les messages est défini : 2min30 pour les visiteurs, 10 minutes pour les autres
		 * Chaque joueur a une variable qui correspond à l'ID du dernier message (dans l'ArrayList) pour ne pas répéter deux fois le même
		 */
		
	}
	
	
	
	
	
	
	
	/*
	 * Configuration AFK
	 */
	/**
	 * En secondes
	 */
	public int AFK_timeoutAutoAfkMessage;
	/**
	 * En secondes
	 */
	public int AFK_timeoutAutoAfkKick; // 10 min
	
	
	
	
	/*
	 * Configuration analyse du chat et des messages privés
	 * (antispam, insultes, publicité)
	 */

	/**
	 * En milisecondes
	 */
	public long ChatAnalysis_timeBeforeResendSameMessage;// 2 min
	/**
	 * En milisecondes
	 */
	public long ChatAnalysis_timeBeforeResendSameCommand;// 60 sec
	/**
	 * En milisecondes
	 */
	public long ChatAnalysis_timePerCaracterForNewMessage;// 0.1 sec
	public int ChatAnalysis_maxViolationLevel;
	public int ChatAnalysis_nbSecondForOneVLDown;
	
	
	
	
	public List<String> ChatAnalysis_badWords;	// les insultes
	
	private void initChatAnalysisBadWord() {
		ChatAnalysis_badWords = new ArrayList<String>();
		
		/*
		 * Insultes
		 */
		ChatAnalysis_badWords.add("pu+tes?");
		ChatAnalysis_badWords.add("conn?a(rd?|ss?e?)");
		ChatAnalysis_badWords.add("sal(o+|au)pe?s?");
		ChatAnalysis_badWords.add("[ea]ncul(é|e|er|ai(s|t|))");
		ChatAnalysis_badWords.add("merdes?");
		ChatAnalysis_badWords.add("ni(qu|k)e? ta m(è|e|é)re?");
		ChatAnalysis_badWords.add("fil?s de putes?");
		ChatAnalysis_badWords.add("ta m(è|e|é)re? l(a|e) putes?");
		ChatAnalysis_badWords.add("tafiole?s?");
		ChatAnalysis_badWords.add("vas? te pendre");
		ChatAnalysis_badWords.add("fuck");
		ChatAnalysis_badWords.add("mother ?fuc?ker");
		ChatAnalysis_badWords.add("dick");
		ChatAnalysis_badWords.add("ass");
		ChatAnalysis_badWords.add("bitch");
		//ChatAnalysis_badWords.add("");
		
		
		/*
		 * Pub pour des serveurs (avec sous domaines type *.mtxserv.fr ou nom de serveur connu genre Minefield)
		 */
		ChatAnalysis_badWords.add("minefield");
		ChatAnalysis_badWords.add("mineplex");
		ChatAnalysis_badWords.add("hypixel");
		//ChatAnalysis_badWords.add("");
		//ChatAnalysis_badWords.add("");
		//ChatAnalysis_badWords.add("");
	}
	
	
	
	
	
	
	
	
	
	/*
	 * Alias pour les commandes
	 */
	
	public List<Map<String, String>> CommandAlias_alias;
	
	private void initCommandAlias() {
		CommandAlias_alias = new ArrayList<Map<String, String>>();
		Map<String, String> alias;
		
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/day");
		alias.put("replaceWith", "/ptime day");
		alias.put("permissions", "group.users"); // multiple permission separated with semicolumn
		CommandAlias_alias.add(alias);
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/night");
		alias.put("replaceWith", "/ptime night");
		alias.put("permissions", "group.users");
		CommandAlias_alias.add(alias);
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/time");
		alias.put("replaceWith", "/ptime");
		alias.put("permissions", "group.users");
		CommandAlias_alias.add(alias);
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/shop");
		alias.put("replaceWith", "/warp shop");
		alias.put("permissions", "*"); // tout le monde
		CommandAlias_alias.add(alias);
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/lobby");
		alias.put("replaceWith", "/spawn");
		alias.put("permissions", "*"); // tout le monde
		CommandAlias_alias.add(alias);
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/hub");
		alias.put("replaceWith", "/spawn");
		alias.put("permissions", "*"); // tout le monde
		CommandAlias_alias.add(alias);
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/tete");
		alias.put("replaceWith", "/heads nick");
		alias.put("permissions", "*");
		CommandAlias_alias.add(alias);
		
		alias = new HashMap<String, String>();
		alias.put("initialCommand", "/inscription");
		alias.put("replaceWith", "/mail send marcbal Inscription");
		alias.put("permissions", "group.users");
		CommandAlias_alias.add(alias);
		/*
		Map<String, String> alias = new HashMap<String, String>();
		alias.put("initialCommand", "");
		alias.put("replaceWith", "");
		alias.put("permissions", "");
		CommandAlias_alias.add(alias);
		*/
	}
	
	
	
	
	
	
	
	
	
	public List<String> CuboCommand_worlds = new ArrayList<String>();
	
	public String ServerMessages_prefix;
	public String ServerMessages_defaultColor;
	
	
	
	public String ServerMOTD;
	
	
	
	
}
