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

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.WorldGuardInterface;

import org.bukkit.World;
import org.bukkit.entity.Player;

import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;

public class SurvivalCuboManager {
	public WorldGuardPlugin wgPlugin = WorldGuardInterface.getPlugin();
	
	public final String regex_cubo_id = "cubo[0-9]+-[0-9A-Za-z_]+-[0-9A-Za-z_]+";
	
	
	
	
	
	
	/**
	 * @param p le joueur
	 * @param w le monde
	 * @return tout les cubos d'un joueur donné sur un monde donné
	 */
	public List<ProtectedCuboidRegion> getPlayerCubo(Player p, World w) {
		return getPlayerCubo(p.getName(), w);
	}
	

	/**
	 * @param p le pseudo du joueur
	 * @param w le monde
	 * @return tout les cubos d'un joueur donné sur un monde donné
	 */
	public List<ProtectedCuboidRegion> getPlayerCubo(String p, World w) {
		
		Map<String, ProtectedRegion> regions = wgPlugin.getRegionManager(w).getRegions();
		List<ProtectedCuboidRegion> playerRegions = new ArrayList<ProtectedCuboidRegion>();
		
		for (Map.Entry<String, ProtectedRegion> region : regions.entrySet()) {
			// on ne prend en charge que les cuboides
			if (!(region.getValue() instanceof ProtectedCuboidRegion))
				continue;
			// on garde les régions gérés par la commande
			if (!region.getValue().getId().matches(regex_cubo_id))
				continue;
			if (!region.getValue().isOwner(p))
				continue;
			playerRegions.add((ProtectedCuboidRegion)region.getValue());
		}
		return playerRegions;
	}
	
	/**
	 * 
	 * @param p le joueur
	 * @param w le monde
	 * @return le volume total des cubos d'un joueur donné sur un monde donné
	 */
	public int getPlayerActualBlockCount(Player p, World w) {
		return getPlayerActualBlockCount(p.getName(), w);
	}
	
	/**
	 * 
	 * @param p le joueur
	 * @param w le monde
	 * @return le volume total des cubos d'un joueur donné sur un monde donné
	 */
	public int getPlayerActualBlockCount(String p, World w) {
		List<ProtectedCuboidRegion> regions = getPlayerCubo(p, w);
		int nb = 0;
		for (ProtectedCuboidRegion region : regions){
			nb += region.volume();
		}
		return nb;
	}
	
	/**
	 * 
	 * @param nb le volume
	 * @return le prix pour le volume donné
	 */
	public double getVolumePrice(int nb) {
		if (nb <= 2000)
			return 0;
		
		if (nb<= 100000)
			return nb-2000D;
		
		return Math.pow(((nb-2000D)/98000D),1.5)*98000;
	}
	
	
	
	public boolean hasStaffPermission(Player p) {
		return p.hasPermission("pandacraft.cubo.staff");
	}
	

}
