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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Set;

import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface;
import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.WorldEditInterface;
import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.WorldGuardInterface;
import net.mc_pandacraft.java.util.StringUtil;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.UnsupportedIntersectionException;
import com.sk89q.worldguard.protection.databases.ProtectionDatabaseException;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;

public class CommandCubo extends AbstractCommandExecutor {
	
	public CommandCubo() {
		super("cubo");
	}

	


	@Override
	public boolean onCommand(CommandSender sender, Command command,
			String label, String[] args) {
		
		WorldGuardPlugin wgPlugin = WorldGuardInterface.getPlugin();
		
		if (args.length == 0 || !(sender instanceof Player))
		{
			showHelp(sender);
			return true;
		}
		
		// la commande contient au moins un paramètre et la personne qui fait la commande est un Joueur
		Player player = (Player) sender;
		
		// on vérifie que le joueur se trouve bien dans un monde dans lequel on peut cubo
		if (!ConfigManager.getInstance().defaultConfig.cubos_worlds.contains(player.getWorld().getName()))
		{
			player.sendMessage(ChatColor.RED+"Les cubos ne se font pas sur cette map");
			return true;
		}
		
		
		if (args[0].equalsIgnoreCase("devis"))
		{
			CuboidSelection selection = WorldEditInterface.getPlayerCuboSelection(player);
			if (selection == null)
			{
				player.sendMessage(ChatColor.RED+"Vous devez faire une sélection WorldEdit : faites "+ChatColor.GRAY+"//wand"+ChatColor.RED+" pour avoir l'outil nécessaire");
				return true;
			}

			if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 2 && plugin.getServer().getPlayer(args[1]) == null)
			{	// un joueur est indiqué mais il n'est pas connecté
				player.sendMessage(ChatColor.RED+"Le joueur concerné n'est pas en ligne");
				return true;
			}

			
			// on cherche si on traite un autre joueur
			Player player_cubo;
			if (!plugin.survivalCuboManager.hasStaffPermission(player) || args.length < 2 || (player_cubo = plugin.getServer().getPlayer(args[1])) == null)
				player_cubo = player;
			
			player.sendMessage(ChatColor.GOLD+"----- Devis pour la création d'un cubo -----");
			if (player != player_cubo)
				player_cubo.sendMessage(ChatColor.GOLD+"----- Devis pour la création d'un cubo -----");
			
			// vérifie si la sélection interfère avec un cubo existant
			// on crée un cubo factice (qui ne sera pas enregistré)
			ProtectedCuboidRegion cubo = new ProtectedCuboidRegion("null", selection.getNativeMinimumPoint().toBlockVector(), selection.getNativeMaximumPoint().toBlockVector());
			// on récupère les cubos de la map pour les comparer
			List<ProtectedRegion> regions = new ArrayList<ProtectedRegion>(wgPlugin.getRegionManager(selection.getWorld()).getRegions().values());
			boolean intersect = true;
			for (ProtectedRegion reg : regions.toArray(new ProtectedRegion[regions.size()])) {
				if (reg.getPriority() < 0)
					regions.remove(reg);
			}
			List<ProtectedRegion> intersect_region = null;
			try {
				intersect_region = ((ProtectedRegion)cubo).getIntersectingRegions(regions);
				if (intersect_region.size()==0) intersect = false;
			} catch (UnsupportedIntersectionException e) { }
			
			if (intersect)
			{
				player.sendMessage(ChatColor.RED+"La sélection rentre en contact avec au moins un cubo existant");
				if (player != player_cubo)
					player_cubo.sendMessage(ChatColor.RED+"La sélection rentre en contact avec au moins un cubo existant");
				if (intersect_region != null)
				{
					for(ProtectedRegion region : intersect_region)
					{
						player.sendMessage(ChatColor.RED+"- "+ChatColor.GRAY+region.getId());
					}
				}
			}

			if (player != player_cubo)
			{
				player.sendMessage(ChatColor.GOLD+"Pour le joueur "+ChatColor.RESET+player_cubo.getDisplayName());
				player_cubo.sendMessage(ChatColor.GOLD+"Devis fait par "+ChatColor.RESET+player.getDisplayName());
				
			}
			
			
			// on vérifie si le joueur peut payer
			double actual_money = EssentialsInterface.getPlayerMoney(player_cubo);
			
			int volume_actuel_cubo = plugin.survivalCuboManager.getPlayerActualBlockCount(player_cubo, selection.getWorld());
			int volume_apres_cubo = volume_actuel_cubo + cubo.volume();
			double prix_actuel_cubo = plugin.survivalCuboManager.getVolumePrice(volume_actuel_cubo);
			double prix_apres_cubo = plugin.survivalCuboManager.getVolumePrice(volume_apres_cubo);
			double prix_a_payer = prix_apres_cubo - prix_actuel_cubo;

			player.sendMessage(ChatColor.GOLD+"Solde actuel : "+StringUtil.formatDouble(actual_money));
			player.sendMessage(ChatColor.GOLD+"Prix à payer : "+StringUtil.formatDouble(prix_a_payer));
			player.sendMessage(ChatColor.GOLD+"Solde futur : "+StringUtil.formatDouble(actual_money - prix_a_payer));

			if (player != player_cubo)
			{
				player_cubo.sendMessage(ChatColor.GOLD+"Solde actuel : "+StringUtil.formatDouble(actual_money));
				player_cubo.sendMessage(ChatColor.GOLD+"Prix à payer : "+StringUtil.formatDouble(prix_a_payer));
				player_cubo.sendMessage(ChatColor.GOLD+"Futur solde : "+StringUtil.formatDouble(actual_money - prix_a_payer));
			}
			
			if (actual_money - prix_a_payer < 0)
			{
				// le joueur ne peut pas payer
				if (player == player_cubo)
					player.sendMessage(ChatColor.RED+"Vous ne pouvez pas payer");
				else
				{

					player.sendMessage(player_cubo.getDisplayName()+ChatColor.RED+" ne peut pas payer");
					player_cubo.sendMessage(ChatColor.RED+"Vous ne pouvez pas payer");
				}
				
				
			}
			return true;
		}
		
		if (args[0].equalsIgnoreCase("creer") && args.length >= 2)
		{
			String nom_cubo = args[1];
			
			if (!nom_cubo.matches("[0-9a-zA-Z_]+"))
			{
				player.sendMessage(ChatColor.RED+"Le nom du cubo n'est pas valide : il doit contenir des lettres/chiffres et tiret du bas "+ChatColor.GRAY+"_");
				return true;
			}
			
			
			CuboidSelection selection = WorldEditInterface.getPlayerCuboSelection(player);
			if (selection == null)
			{
				player.sendMessage(ChatColor.RED+"Vous devez faire une sélection WorldEdit : faites "+ChatColor.GRAY+"//wand");
				return true;
			}
			if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 3 && plugin.getServer().getPlayer(args[2]) == null)
			{	// un joueur est indiqué mais il n'est pas connecté
				player.sendMessage(ChatColor.RED+"Le joueur concerné n'est pas en ligne");
				return true;
			}
			
			// on cherche si on traite un autre joueur
			Player player_cubo;
			if (!plugin.survivalCuboManager.hasStaffPermission(player) || args.length < 3 || (player_cubo = plugin.getServer().getPlayer(args[2])) == null)
				player_cubo = player;
			
			player.sendMessage(ChatColor.GOLD+"----- Création d'un cubo -----");
			if (player != player_cubo)
			{
				player.sendMessage(ChatColor.GOLD+"Pour le joueur "+ChatColor.RESET+player_cubo.getDisplayName());
				
				player_cubo.sendMessage(ChatColor.GOLD+"----- Création d'un cubo -----");
				player_cubo.sendMessage(ChatColor.GOLD+"Protection faite par "+ChatColor.RESET+player.getDisplayName());
				
			}
			
			// vérifie si la sélection interfère avec un cubo existant
			
			// on crée le cubo
			String id_cubo;
			do
				id_cubo = "cubo"+(new Random()).nextInt(1000000000)+"-"+player_cubo.getName()+"-"+nom_cubo;
			while(wgPlugin.getRegionManager(selection.getWorld()).hasRegion(id_cubo));
			ProtectedCuboidRegion cubo = new ProtectedCuboidRegion(id_cubo, selection.getNativeMinimumPoint().toBlockVector(), selection.getNativeMaximumPoint().toBlockVector());
			DefaultDomain owners = new DefaultDomain();
			owners.addPlayer(player_cubo.getName());
			cubo.setOwners(owners);
			
			
			// on récupère les cubos de la map pour les comparer

			List<ProtectedRegion> regions = new ArrayList<ProtectedRegion>(wgPlugin.getRegionManager(selection.getWorld()).getRegions().values());
			boolean intersect = true;
			for (ProtectedRegion reg : regions.toArray(new ProtectedRegion[regions.size()])) {
				if (reg.getPriority() < 0)
					regions.remove(reg);
			}
			List<ProtectedRegion> intersect_region = null;
			try {
				intersect_region = ((ProtectedRegion)cubo).getIntersectingRegions(regions);
				if (intersect_region.size()==0) intersect = false;
			} catch (UnsupportedIntersectionException e) { }
			
			if (intersect)
			{
				player.sendMessage(ChatColor.RED+"La protection ne peut pas se faire");
				player.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/cubo devis"+ChatColor.RED+" pour en connaitre la raison");
				if (player != player_cubo)
					player_cubo.sendMessage(ChatColor.RED+"La protection ne peut pas se faire");
				return true;
			}
			
			
			// on vérifie si le joueur peut payer
			double actual_money = EssentialsInterface.getPlayerMoney(player_cubo);
			
			int volume_actuel_cubo = plugin.survivalCuboManager.getPlayerActualBlockCount(player_cubo, selection.getWorld());
			int volume_apres_cubo = volume_actuel_cubo + cubo.volume();
			double prix_actuel_cubo = plugin.survivalCuboManager.getVolumePrice(volume_actuel_cubo);
			double prix_apres_cubo = plugin.survivalCuboManager.getVolumePrice(volume_apres_cubo);
			double prix_a_payer = prix_apres_cubo - prix_actuel_cubo;

			
			if (actual_money - prix_a_payer < 0)
			{
				// le joueur ne peut pas payer

				player.sendMessage(ChatColor.RED+"La protection ne peut pas se faire");
				player.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/cubo devis"+ChatColor.RED+" pour en connaitre la raison");
				if (player != player_cubo)
					player_cubo.sendMessage(ChatColor.RED+"La protection ne peut pas se faire");
				
				return true;
			}
			
			
			player_cubo.sendMessage(ChatColor.GOLD+"Ancien solde : "+StringUtil.formatDouble(actual_money));
			player_cubo.sendMessage(ChatColor.GOLD+"Prix à payer : "+StringUtil.formatDouble(prix_a_payer));
			player_cubo.sendMessage(ChatColor.GOLD+"Nouveau solde : "+StringUtil.formatDouble(actual_money - prix_a_payer));
			player_cubo.sendMessage(ChatColor.GREEN+"L'argent est automatiquement retiré de votre compte");
			if (player != player_cubo)
				player.sendMessage(ChatColor.GREEN+"L'argent est automatiquement retiré du compte de "+ChatColor.RESET+player_cubo.getDisplayName());
			
			
			
			
			// on crée le cubo :
			wgPlugin.getRegionManager(selection.getWorld()).addRegion(cubo);
			try {
				wgPlugin.getRegionManager(selection.getWorld()).save();
			} catch (ProtectionDatabaseException e) {
				e.printStackTrace();
			}
			
			player.sendMessage(ChatColor.GREEN+"La protection "+ChatColor.GRAY+cubo.getId()+ChatColor.GREEN+" a bien été réalisée");
			if (player != player_cubo)
				player_cubo.sendMessage(ChatColor.GREEN+"La protection "+ChatColor.GRAY+cubo.getId()+ChatColor.GREEN+" a bien été réalisée");
			
			// on retire l'argent
			EssentialsInterface.getPlayer(player_cubo).setMoney(new BigDecimal(actual_money - prix_a_payer));
			EssentialsInterface.getPlayer(player_cubo).save();
			
			
			return true;
			
			
			
		}
		
		
		
		
		
		
		if (args[0].equalsIgnoreCase("liste"))
		{
			int num_page = 1;
			try {
				if (args.length >= 2)
					num_page = Integer.parseInt(args[1]);
			} catch (NumberFormatException e) { }
			
			// on cherche si on traite un autre joueur
			String player_cubo = player.getName();
			if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 3)
				player_cubo = args[2];
			
			
			List<ProtectedCuboidRegion> cubos = plugin.survivalCuboManager.getPlayerCubo(player_cubo, player.getWorld());
			
			int nb_page = (int)Math.ceil(cubos.size()/5D);
			if (num_page > nb_page) num_page = nb_page;
			if (num_page < 1) num_page = 1;
			
			player.sendMessage(ChatColor.GOLD+"----- Liste des cubos de "+ChatColor.GRAY+player_cubo+ChatColor.GOLD+" -----");
			if (cubos.size() == 0)
				player.sendMessage(ChatColor.GOLD+"Aucun cubo à afficher");
			 
			for (int i=(num_page-1)*5; i<num_page*5 && i<cubos.size(); i++)
			{
				ProtectedCuboidRegion cubo = cubos.get(i);
				// TODO afficher plus d'infos sur ces cubos
				player.sendMessage(ChatColor.GOLD+cubo.getId()+" : "+cubo.volume()+" cubes");
			}
			
			player.sendMessage(ChatColor.GOLD+"Page "+num_page+"/"+nb_page+" : "+ChatColor.GRAY+"/cubo liste <Page> "+player_cubo);
			return true;
		}
		
		
		
		/*
		 * Dans la suite des sous-commandes, on a besoin de la protection dans le quel se trouve le joueur
		 * 
		 * Si ce cubo n'existe pas, le reste des sous-commandes n'est pas exécutable
		 */
		
		
		
		
		
		// on parcours les cubos dans lesquels on se trouve, on garde le premier valide, si il existe
		ProtectedCuboidRegion inside_cubo = null;
		for(ProtectedRegion cubo : wgPlugin.getRegionManager(player.getWorld()).getApplicableRegions(player.getLocation()))
		{
			if (!(cubo instanceof ProtectedCuboidRegion)) continue;
			if (!cubo.getId().matches(plugin.survivalCuboManager.regex_cubo_id)) continue;
			inside_cubo = (ProtectedCuboidRegion) cubo;
			break;
		}
		
		
		
		
		
		
		
		

		if (args[0].equalsIgnoreCase("info"))
		{
			if (inside_cubo == null)
			{
				player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo");
				return true;
			}
			
			int dim_x = Math.abs(inside_cubo.getMinimumPoint().getBlockX() - inside_cubo.getMaximumPoint().getBlockX()) + 1;
			int dim_y = Math.abs(inside_cubo.getMinimumPoint().getBlockY() - inside_cubo.getMaximumPoint().getBlockY()) + 1;
			int dim_z = Math.abs(inside_cubo.getMinimumPoint().getBlockZ() - inside_cubo.getMaximumPoint().getBlockZ()) + 1;
			Vector midpoint = Vector.getMidpoint(inside_cubo.getMinimumPoint(), inside_cubo.getMaximumPoint());
			String proprio = inside_cubo.getOwners().toUserFriendlyString();
			String membres = inside_cubo.getMembers().toUserFriendlyString();
			
			player.sendMessage(ChatColor.GOLD+"----- Information sur la protection -----");
			player.sendMessage(ChatColor.GOLD+"Identifiant : "+ChatColor.GRAY+inside_cubo.getId());
			player.sendMessage(ChatColor.GOLD+"Dimensions : "+ChatColor.GRAY+"x="+dim_x+" y="+dim_y+" z="+dim_z);
			player.sendMessage(ChatColor.GOLD+"Localisation : "+ChatColor.GRAY+"x="+midpoint.getBlockX()+" y="+midpoint.getBlockY()+" z="+midpoint.getBlockZ());
			player.sendMessage(ChatColor.GOLD+"Volume : "+ChatColor.GRAY+inside_cubo.volume());
			player.sendMessage(ChatColor.GOLD+"Propriétaire : "+ChatColor.GRAY+proprio);
			player.sendMessage(ChatColor.GOLD+"Usagers : "+ChatColor.GRAY+membres);
			
			return true;
		}
		
		if (args[0].equalsIgnoreCase("selectionner"))
		{
			if (inside_cubo == null)
			{
				player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo");
				return true;
			}
			if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player))
			{
				player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo");
				return true;
			}
			
			WorldEditPlugin wePlugin = WorldEditInterface.getPlugin();
			Selection sel = new CuboidSelection(player.getWorld(), inside_cubo.getMinimumPoint(), inside_cubo.getMaximumPoint());
			wePlugin.setSelection(player, sel);
			
			return true;
		}

		
		if (args[0].equalsIgnoreCase("supprimer") && args.length == 1)
		{
			if (inside_cubo == null)
			{
				player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo");
				return true;
			}
			if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player))
			{
				player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo");
				return true;
			}
			
			Set<String> player_name = inside_cubo.getOwners().getPlayers();
			if (player_name == null || player_name.isEmpty())
			{
				player.sendMessage(ChatColor.RED+"Ce cubo n'a aucun propriétaire");
				return true;
			}
			String proprio_cubo = player_name.toArray(new String[1])[0];
			
			double actu_money = EssentialsInterface.getPlugin().getUser(proprio_cubo).getMoney().doubleValue();
			
			int actu_volume_cubo = plugin.survivalCuboManager.getPlayerActualBlockCount(proprio_cubo, player.getWorld());
			int new_volume_cubo = actu_volume_cubo - inside_cubo.volume();
			double money_win = plugin.survivalCuboManager.getVolumePrice(actu_volume_cubo)
					- plugin.survivalCuboManager.getVolumePrice(new_volume_cubo);
			
			
			wgPlugin.getRegionManager(player.getWorld()).removeRegion(inside_cubo.getId());
			EssentialsInterface.getPlugin().getUser(proprio_cubo).setMoney(new BigDecimal(actu_money + money_win));
			
			Player player_cubo = plugin.getServer().getPlayerExact(proprio_cubo);
			
			player.sendMessage(ChatColor.GREEN+"Le cubo "+ChatColor.GRAY+inside_cubo.getId()+ChatColor.GREEN+" a été supprimé");
			if (player_cubo != null && player_cubo != player)
			{
				player_cubo.sendMessage(ChatColor.GREEN+"Le cubo "+ChatColor.GRAY+inside_cubo.getId()+ChatColor.GREEN+" a été supprimé");
			}
			
			if (player_cubo != player)
			{	// le joueur gère le cubo d'un autre joueur (en ligne ou non)
				player.sendMessage(ChatColor.GREEN+"L'argent a été restauré sur le compte de "+ChatColor.GRAY+((player_cubo == null)?proprio_cubo:player_cubo.getName()));
				if (player_cubo != null)
					player_cubo.sendMessage(ChatColor.GREEN+"L'argent a été restauré sur votre compte");
			}
			else // le joueur gère son propre cubo
				player.sendMessage(ChatColor.GREEN+"L'argent a été restauré sur votre compte");
			
			
			return true;
		}
		
		

		
		if (args[0].equalsIgnoreCase("ajouter") && args.length >= 2)
		{
			
			if (inside_cubo == null)
			{
				player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo");
				return true;
			}
			if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player))
			{
				player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo");
				return true;
			}
			
			
			String new_user = args[1];
			
			if (!new_user.matches("[0-9a-zA-Z_]{2,16}"))
			{
				player.sendMessage(ChatColor.RED+"Le pseudo indiqué n'est pas valide");
				return true;
			}
			
			
			
			inside_cubo.getMembers().addPlayer(new_user);
			try {
				wgPlugin.getRegionManager(player.getWorld()).save();
			} catch (ProtectionDatabaseException e) {
				e.printStackTrace();
			}
			
			player.sendMessage(ChatColor.GREEN+"Vous venez d'ajouter "+ChatColor.GRAY+new_user+ChatColor.GREEN+" dans le cubo");
			
			return true;
		}
		

		
		if (args[0].equalsIgnoreCase("enlever") && args.length >= 2)
		{
			
			if (inside_cubo == null)
			{
				player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo");
				return true;
			}
			if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player))
			{
				player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo");
				return true;
			}
			
			
			String old_user = args[1];
			
			if (!old_user.matches("[0-9a-zA-Z_]{2,16}"))
			{
				player.sendMessage(ChatColor.RED+"Le pseudo indiqué n'est pas valide");
				return true;
			}
			
			
			inside_cubo.getMembers().removePlayer(old_user);
			try {
				wgPlugin.getRegionManager(player.getWorld()).save();
			} catch (ProtectionDatabaseException e) {
				e.printStackTrace();
			}
			player.sendMessage(ChatColor.GREEN+"Vous venez de retirer "+ChatColor.GRAY+old_user+ChatColor.GREEN+" du cubo");
			
			
			return true;
		}
		
		

		
		if (args[0].equalsIgnoreCase("donner") && args.length >= 2)
		{
			
			if (inside_cubo == null)
			{
				player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo");
				return true;
			}
			if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player))
			{
				player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo");
				return true;
			}
			
			
			String new_user = args[1];
			
			if (plugin.getServer().getPlayer(new_user) == null)
			{
				player.sendMessage(ChatColor.RED+"Le joueur indiqué n'est pas connecté");
				return true;
			}
			
			Player new_proprio = plugin.getServer().getPlayer(new_user);
			
			
			inside_cubo.setOwners(new DefaultDomain());
			inside_cubo.getOwners().addPlayer(new_proprio.getName());
			inside_cubo.setMembers(new DefaultDomain());
			try {
				wgPlugin.getRegionManager(player.getWorld()).save();
			} catch (ProtectionDatabaseException e) {
				e.printStackTrace();
			}

			player.sendMessage(ChatColor.GREEN+"Vous venez de donner la parcelle courante à "+ChatColor.RESET+new_proprio.getDisplayName());
			new_proprio.sendMessage(player.getDisplayName()+ChatColor.GREEN+" viens de vous donner la parcelle "+ChatColor.GRAY+inside_cubo.getId());
			
			
			return true;
		}
		
		
		

		
		if (args[0].equalsIgnoreCase("convert"))
		{

			if (!plugin.survivalCuboManager.hasStaffPermission(player))
			{
				player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action");
				return true;
			}

			plugin.getLogger().info(ChatColor.BOLD+"Conversion des protections de la map survie en cours...");
			
			List<ProtectedRegion> regions_to_convert = new ArrayList<ProtectedRegion>(wgPlugin.getRegionManager(player.getWorld()).getRegions().values());
			
			int nb_converted = 0;
			int nb_new_converted = 0;
			int nb_concerned = regions_to_convert.size();
			
			
			for (ProtectedRegion region_to_convert : regions_to_convert)
			{
				// on vérifie si c'est un cuboide (ne doit pas être un autre type de protection)
				if (!(region_to_convert instanceof ProtectedCuboidRegion))
				{
					nb_concerned--;
					continue;
				}
				
				if (region_to_convert.getPriority() < 0)
				{
					nb_concerned--;
					continue;
				}
				
				
				// on ignore les cubos dans le bon format
				if (region_to_convert.getId().matches(plugin.survivalCuboManager.regex_cubo_id))
				{
					nb_converted++;
					continue;
				}
				
				// on cherche le propriétaire
				String id = region_to_convert.getId();
				Set<String> owners = region_to_convert.getOwners().getPlayers();
				

				if (owners.size() == 0){
					plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" has no owner");
					continue;
				}
				
				DefaultDomain real_owners = new DefaultDomain();
				DefaultDomain real_members = new DefaultDomain();
				
				for (String p : owners)
				{
					if (id.toLowerCase().contains(p.toLowerCase()))
						real_owners.addPlayer(p);
					else
						real_members.addPlayer(p);
				}
				
				if (real_owners.size() == 0 && owners.size() == 1)
					real_owners.addPlayer(owners.toArray(new String[1])[0]);

				if (real_owners.size() == 0 && owners.size() > 1){
					plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : has multiple owner but nobody is in region ID");
					continue;
				}
				if (real_owners.size() > 1){
					plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : has multiple owner in region ID");
					continue;
				}
				
				String unique_owner = real_owners.getPlayers().toArray(new String[1])[0];
				String cubo_name = id.replace(unique_owner, "").trim();
				if (!cubo_name.matches("[0-9a-zA-Z_]+")){
					plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : new name '"+cubo_name+"' is not a valid name");
					continue;
				}
				
				// on vérifie les intersections
				try {
					List<ProtectedRegion> regions_to_compare_with = new ArrayList<ProtectedRegion>(regions_to_convert);
					regions_to_compare_with.remove(region_to_convert);
					// on ne prends pas en compte les régions donc la priorité est négative (villes groupement de cubos)
					for (ProtectedRegion reg : regions_to_convert) {
						if (reg.getPriority() < 0)
							regions_to_compare_with.remove(reg);
					}
					int nb_inter = region_to_convert.getIntersectingRegions(regions_to_compare_with).size();
					if (nb_inter > 0)
					{
						plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" intersect with "+nb_inter+" other(s) regions");
						continue;
					}
				} catch (UnsupportedIntersectionException e) {
					plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" throw a UnsupportedIntersectionException");
					continue;
				}
				
				
				// création du cubo quiva remplacer l'ancien
				String id_cubo;
				do
					id_cubo = "cubo"+(new Random()).nextInt(1000000000)+"-"+unique_owner+"-"+cubo_name;
				while(wgPlugin.getRegionManager(player.getWorld()).hasRegion(id_cubo));
				
				ProtectedCuboidRegion new_region = new ProtectedCuboidRegion(id_cubo, region_to_convert.getMinimumPoint(), region_to_convert.getMaximumPoint());
				new_region.setMembers(real_members);
				new_region.setOwners(real_owners);
				new_region.setFlags(region_to_convert.getFlags());
				new_region.setPriority(region_to_convert.getPriority());
				
				wgPlugin.getRegionManager(player.getWorld()).removeRegion(region_to_convert.getId());
				wgPlugin.getRegionManager(player.getWorld()).addRegion(new_region);

				try {
					wgPlugin.getRegionManager(player.getWorld()).save();
				} catch (ProtectionDatabaseException e) {
					e.printStackTrace();
				}
				
				
				nb_converted++;
				nb_new_converted++;
			}
			
			plugin.getLogger().info(ChatColor.GREEN+""+nb_converted+"/"+nb_concerned+" régions converties ("+nb_new_converted+" nouvelles)");
			player.sendMessage(ChatColor.GREEN+""+nb_converted+"/"+nb_concerned+" régions converties ("+nb_new_converted+" nouvelles). Voir la console pour les régions non converties");
			
			return true;
		}
		
		
		
		
		
		
		
		
		// on arrive ici si aucune des sous commandes correspond à celle tapée
		sender.sendMessage(ChatColor.RED+"Mauvaise utilisation de la commande. Faites "+ChatColor.GRAY+"/cubo"+ChatColor.RED+" pour connaitre l'utilisation");
		return true;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	private void showHelp(CommandSender sender) {
		
		String[] messages = null;
		if ((sender instanceof Player) && plugin.survivalCuboManager.hasStaffPermission((Player)sender))
		{	// pour le staff connecté
			String[] m = {
					ChatColor.GOLD+"----- Assistant de protection en Survie -----",
					ChatColor.GRAY+"/cubo devis [Pseudo]"+ChatColor.GOLD+" pour calculer le prix du cubo et estimer sa faisabilité. Précisez le pseudo si ce n'est pas pour vous",
					ChatColor.GRAY+"/cubo creer <NomDuCubo> [Pseudo]"+ChatColor.GOLD+" pour créer le cubo. Précisez le pseudo si ce n'est pas pour vous",
					ChatColor.GRAY+"/cubo info"+ChatColor.GOLD+" pour afficher les infos du cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo selectionner"+ChatColor.GOLD+" pour faire une sélection WorldEdit du cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo supprimer"+ChatColor.GOLD+" pour supprimer le cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo ajouter <Pseudo>"+ChatColor.GOLD+" pour ajouter un usager dans le cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo enlever <Pseudo>"+ChatColor.GOLD+" pour enlever un usager du cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo liste <Page> [Pseudo]"+ChatColor.GOLD+" pour lister vos cubos. Précisez le pseudo si vous voulez lister les cubos d'un autre joueur",
					ChatColor.GRAY+"/cubo donner <Pseudo>"+ChatColor.GOLD+" pour donner le cubo dans lequel vous êtes à un joueur",
					ChatColor.GOLD+"------------------------------------------"
			};
			messages = m;
		}
		else if (sender instanceof Player)
		{	// pour les joueurs
			String[] m = {
					ChatColor.GOLD+"----- Assistant de protection en Survie -----",
					ChatColor.GRAY+"/cubo devis"+ChatColor.GOLD+" pour calculer le prix du cubo et estimer sa faisabilité",
					ChatColor.GRAY+"/cubo creer <NomDuCubo>"+ChatColor.GOLD+" pour créer le cubo si il est faisable.",
					ChatColor.GRAY+"/cubo info"+ChatColor.GOLD+" pour afficher les infos du cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo selectionner"+ChatColor.GOLD+" pour faire une sélection WorldEdit du cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo supprimer"+ChatColor.GOLD+" pour supprimer le cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo ajouter <Pseudo>"+ChatColor.GOLD+" pour ajouter un usager dans le cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo enlever <Pseudo>"+ChatColor.GOLD+" pour enlever un usager du cubo dans lequel vous êtes",
					ChatColor.GRAY+"/cubo liste <Page>"+ChatColor.GOLD+" pour lister vos cubos",
					ChatColor.GRAY+"/cubo donner <Pseudo>"+ChatColor.GOLD+" pour donner le cubo dans lequel vous êtes à un joueur",
					ChatColor.GOLD+"------------------------------------------"
			};
			messages = m;
		}
		else
		{	// pour la console et le reste (pas les joueurs)
			String[] m = {
					ChatColor.GOLD+"----- Assistant de protection en Survie -----",
					ChatColor.GOLD+"Vous devez être connecté pour exécuter les commandes de cubo",
					ChatColor.GOLD+"---------------------------------------------"
			};
			messages = m;
		}
		sender.sendMessage(messages);
	}
	
	
	
	
	
	
	
	
	
	

}
