package net.knarcraft.blacksmith.util;
import net.knarcraft.blacksmith.config.SettingValueType;
import net.knarcraft.blacksmith.config.SmithPreset;
import net.knarcraft.blacksmith.config.SmithPresetFilter;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Registry;
import org.bukkit.enchantments.Enchantment;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* A helper class for getting valid values for tab-completion
*/
public final class TabCompleteValuesHelper {
private TabCompleteValuesHelper() {
}
/**
* Gets tab-completion values for the given value type
*
* @param valueType
The value type to get possible values for
* @return The values to show the user
*/
public static @NotNull List getTabCompletions(@NotNull SettingValueType valueType) {
return switch (valueType) {
case POSITIVE_INTEGER -> getPositiveIntegers();
case BOOLEAN -> getBooleans();
case POSITIVE_DOUBLE -> getPositiveDoubles();
case STRING -> getStrings();
case PERCENTAGE -> getPercentages();
case REFORGE_ABLE_ITEMS -> getReforgeAbleMaterials();
case MATERIAL -> getAllReforgeAbleMaterialNames();
case ENCHANTMENT, ENCHANTMENT_LIST -> getAllEnchantments();
case STRING_LIST -> List.of("*_SHOVEL,*_PICKAXE,*_AXE,*_HOE,*_SWORD:STICK,SMITHING_TABLE:*_PLANKS");
// TODO: Change this to something that makes sense
case ADVANCED_COST -> List.of();
};
}
/**
* Gets a complete list of all reforge-able material names
*
* @return A complete list of reforge-able material names
*/
private static @NotNull List getAllReforgeAbleMaterialNames() {
List reforgeAbleMaterials = new ArrayList<>();
for (Material material : ItemHelper.getAllReforgeAbleMaterials()) {
reforgeAbleMaterials.add(material.name());
}
reforgeAbleMaterials.add("NETHERITE_*");
reforgeAbleMaterials.add("DIAMOND_*");
reforgeAbleMaterials.add("GOLDEN_*");
reforgeAbleMaterials.add("IRON_*");
reforgeAbleMaterials.add("CHAINMAIL_*");
reforgeAbleMaterials.add("STONE_*");
reforgeAbleMaterials.add("*BOW");
reforgeAbleMaterials.add("LEATHER_*");
reforgeAbleMaterials.add("WOODEN_*");
return reforgeAbleMaterials;
}
/**
* Gets a complete list of enchantments
*
* @return A complete list of enchantments
*/
private static @NotNull List getAllEnchantments() {
Registry enchantmentRegistry = Bukkit.getRegistry(Enchantment.class);
if (enchantmentRegistry == null) {
throw new RuntimeException("Unable to get the enchantment registry");
}
List enchantments = new ArrayList<>();
for (Enchantment enchantment : enchantmentRegistry) {
// Note: While depreciated in Spigot, the new method is not available for Paper
//noinspection deprecation
enchantments.add(enchantment.getKey().getKey());
}
return enchantments;
}
/**
* Gets some example possible values for reforge-able materials
*
* @return Some example possible values for reforge-able materials
*/
private static @NotNull List getReforgeAbleMaterials() {
List stringLists = new ArrayList<>();
for (SmithPreset preset : SmithPreset.values()) {
stringLists.add("preset:" + preset.name());
for (SmithPresetFilter filter : preset.getSupportedFilters()) {
stringLists.add("preset:" + preset.name() + ":" + filter.name());
}
}
stringLists.add("preset:WEAPON_SMITH:RANGED,SHIELD");
stringLists.add("preset:WEAPON_SMITH,preset:ARMOR_SMITH");
stringLists.add("preset:WEAPON_SMITH,preset:TOOL_SMITH");
stringLists.add("preset:ARMOR_SMITH,preset:TOOL_SMITH");
stringLists.add("BOW,CROSSBOW,ELYTRA");
return stringLists;
}
/**
* Gets some example string values
*
* @return Some example string values
*/
private static @NotNull List getStrings() {
List strings = new ArrayList<>(1);
strings.add("&aExample message. Use & for color tags.");
return strings;
}
/**
* Gets some example percentage values
*
* @return Some example percentage values
*/
private static @NotNull List getPercentages() {
List percentages = new ArrayList<>(6);
percentages.add("0");
percentages.add("10");
percentages.add("25");
percentages.add("45");
percentages.add("75");
percentages.add("100");
return percentages;
}
/**
* Gets some possible positive doubles
*
* @return Some possible positive doubles
*/
private static @NotNull List getPositiveDoubles() {
List positiveDoubles = new ArrayList<>(4);
positiveDoubles.add("0.0");
positiveDoubles.add("0.0001");
positiveDoubles.add("5.0");
positiveDoubles.add("7.34");
positiveDoubles.add("5674.34534");
return positiveDoubles;
}
/**
* Gets some example positive integers
*
* @return Some example positive integers
*/
private static @NotNull List getPositiveIntegers() {
List positiveIntegers = new ArrayList<>(6);
positiveIntegers.add("0");
positiveIntegers.add("5");
positiveIntegers.add("10");
positiveIntegers.add("25");
positiveIntegers.add("50");
positiveIntegers.add("100");
positiveIntegers.add("4565");
return positiveIntegers;
}
/**
* Gets the possible boolean values
*
* @return The possible boolean values
*/
private static @NotNull List getBooleans() {
List booleans = new ArrayList<>(2);
booleans.add("True");
booleans.add("False");
return booleans;
}
}