package de.tobiyas.racesandclasses.datacontainer.traitholdercontainer;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.ChatColor;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.APIs.LevelAPI;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.classes.ClassManager;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race.RaceManager;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.util.config.YAMLConfigExtended;
public class HolderSelectionPreconditions {
/**
* The Empty Race element.
*/
public static final HolderSelectionPreconditions EMPTY_RACE = new HolderSelectionPreconditions(-1, null, null, RacesAndClasses.getPlugin().getRaceManager());
/**
* The Empty Class element.
*/
public static final HolderSelectionPreconditions EMPTY_CLASS = new HolderSelectionPreconditions(-1, null, null, RacesAndClasses.getPlugin().getClassManager());
/**
* The Min level to have.
*/
private final int minLevel;
/**
* The Holder to have before
*/
private final String preHolder;
/**
* The Permission to hold.
*/
private final String prePerm;
/**
* The Holder Manager to use.
*/
private final AbstractHolderManager holderManager;
private HolderSelectionPreconditions(int minLevel, String preHolder, String prePerm,
AbstractHolderManager holderManager) {
this.minLevel = minLevel;
this.preHolder = preHolder;
this.prePerm = prePerm;
this.holderManager = holderManager;
}
/**
* Returns if the Preconditions are met.
*
* @param player to check
*
* @return true if preconditions are met.
*/
public HolderPreconditionResult checkPreconditions(RaCPlayer player){
//check min level.
if(minLevel > 0) {
if( player.getLevelManager().getCurrentLevel() < minLevel ) return HolderPreconditionResult.LEVEL_TOO_LOW;
}
//check pre holder.
if(preHolder != null){
AbstractTraitHolder holder = holderManager.getHolderOfPlayer(player);
if(holder != null && preHolder.equalsIgnoreCase(holder.getDisplayName())) {
return HolderPreconditionResult.HOLDER_NOT_PRESENT;
}
}
//check permission
if(prePerm != null){
if(!RacesAndClasses.getPlugin().getPermissionManager().checkPermissionsSilent(player.getPlayer(), prePerm)){
return HolderPreconditionResult.PERMISSION_NOT_PRESENT;
}
}
return HolderPreconditionResult.RESTRICTIONS_MET;
}
/**
* Generates a List of Descriptions for Preconditions.
*
* @return a list of Descriptions.
*/
public List<String> generateDescription(RaCPlayer player) {
List<String> list = new LinkedList<String>();
list.add(ChatColor.LIGHT_PURPLE + "Preconditions:");
if(minLevel > 0) {
boolean hasLevel = LevelAPI.getCurrentLevel(player) >= minLevel;
list.add((hasLevel ? ChatColor.GREEN : ChatColor.RED) + "- Needs level " + minLevel);
}
if(preHolder != null){
AbstractTraitHolder holder = holderManager.getHolderOfPlayer(player);
boolean hasHolder = holder != null && holder.getDisplayName().equalsIgnoreCase(preHolder);
list.add((hasHolder ? ChatColor.GREEN : ChatColor.RED)
+ "- Needs " + holder.getContainerTypeAsString()
+ " " + preHolder);
}
if(prePerm != null) {
boolean hasPerm = RacesAndClasses.getPlugin().getPermissionManager().checkPermissionsSilent(player.getRealPlayer(), prePerm);
list.add((hasPerm ? ChatColor.GREEN : ChatColor.RED) + "- Needs Permission");
}
if(list.size() == 1) list.clear();
return list;
}
/**
* Reads Preconditions from Config.
*
* @param config to read from.
*
* @return the parsed Holder selection Preconditions.
*/
public static HolderSelectionPreconditions parse(YAMLConfigExtended config, AbstractHolderManager manager){
if(config == null || !config.getValidLoad()) return getEmpty(manager);
if(config.getRootChildren().isEmpty()) return getEmpty(manager);
String pre = config.getRootChildren().iterator().next();
pre+=".preconditions.";
int preLevel = config.getInt(pre + "level", -1);
String holder = config.getString(pre + "holder", null);
String permission = config.getString(pre + "permission", null);
return new HolderSelectionPreconditions(preLevel, holder, permission, manager);
}
/**
* Returns the Empty Container.
*
* @param manager to use for selection.
*
* @return the empty Container.
*/
public static HolderSelectionPreconditions getEmpty(AbstractHolderManager manager){
if(manager instanceof RaceManager) return EMPTY_RACE;
if(manager instanceof ClassManager) return EMPTY_CLASS;
return EMPTY_RACE;
}
public enum HolderPreconditionResult{
LEVEL_TOO_LOW,
HOLDER_NOT_PRESENT,
PERMISSION_NOT_PRESENT,
RESTRICTIONS_MET;
}
}