package be.isach.ultracosmetics.menu.menus;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.UltraCosmeticsData;
import be.isach.ultracosmetics.config.MessageManager;
import be.isach.ultracosmetics.config.SettingsManager;
import be.isach.ultracosmetics.cosmetics.Category;
import be.isach.ultracosmetics.cosmetics.Cosmetic;
import be.isach.ultracosmetics.cosmetics.suits.ArmorSlot;
import be.isach.ultracosmetics.cosmetics.suits.Suit;
import be.isach.ultracosmetics.cosmetics.type.SuitType;
import be.isach.ultracosmetics.menu.CosmeticMenu;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.util.ItemFactory;
import be.isach.ultracosmetics.util.MathUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.material.MaterialData;
import java.util.ArrayList;
import java.util.List;
/**
* Suit {@link be.isach.ultracosmetics.menu.Menu Menu}.
*
* @author iSach
* @since 08-23-2016
*/
public final class MenuSuits extends CosmeticMenu<SuitType> {
private static final int[] SLOTS = new int[]{10, 11, 12, 13, 14, 15, 16, 17};
private static final Category CATEGORY = Category.SUITS;
public MenuSuits(UltraCosmetics ultraCosmetics) {
super(ultraCosmetics, CATEGORY);
}
@Override
public void open(UltraPlayer player, int page) {
if (page > getMaxPages()) {
page = getMaxPages();
}
if (page < 1) {
page = 1;
}
Inventory inventory = Bukkit.createInventory(null, getSize(), getMaxPages() == 1 ? getName() : getName(page));
// Cosmetic items.
int i = 0;
int from = (page - 1) * 7; // 0->6 7->13 14->20
int to = page * 7 - 1;
superLoop:
for (int h = from; h <= to; h++) {
if (h >= enabled().size()) {
break;
}
SuitType suitType = enabled().get(h);
if (!suitType.isEnabled()) {
continue;
}
//slotLoop:
for (int l = 0; l < 4; l++) {
ArmorSlot armorSlot = ArmorSlot.values()[l];
Suit suit = player.getSuit(armorSlot);
int slot = SLOTS[i] + l * 9;
if (SettingsManager.getConfig().getBoolean("No-Permission.Dont-Show-Item")) {
if (!player.hasPermission(suitType.getPermission(armorSlot))) {
continue;
}
}
if (SettingsManager.getConfig().getBoolean("No-Permission.Custom-Item.enabled")
&& !player.hasPermission(suitType.getPermission(armorSlot))) {
Material material = Material.valueOf((String) SettingsManager.getConfig().get("No-Permission.Custom-Item.Type"));
Byte data = Byte.valueOf(String.valueOf(SettingsManager.getConfig().get("No-Permission.Custom-Item.Data")));
String name = String.valueOf(SettingsManager.getConfig().get("No-Permission.Custom-Item.Name"));
name = ChatColor.translateAlternateColorCodes('&', name.replace("{cosmetic-name}", suitType.getName()));
List<String> npLore = SettingsManager.getConfig().getStringList("No-Permission.Custom-Item.Lore");
String[] array = new String[npLore.size()];
npLore.toArray(array);
putItem(inventory, COSMETICS_SLOTS[i], ItemFactory.create(material, data, name, array), clickData -> {
Player clicker = clickData.getClicker().getBukkitPlayer();
clicker.sendMessage(MessageManager.getMessage("No-Permission"));
clicker.closeInventory();
});
i++;
continue superLoop;
}
String toggle = (suit != null && suit.getType() == suitType) ? CATEGORY.getDeactivateMenu() : CATEGORY.getActivateMenu();
ItemStack is = ItemFactory.create(suitType.getMaterial(armorSlot), suitType.getData(), toggle + " " + suitType.getName(armorSlot));
if (suit != null && suit.getType() == suitType) {
is = ItemFactory.addGlow(is);
}
ItemMeta itemMeta = is.getItemMeta();
if(suitType == SuitType.SANTA
|| suitType == SuitType.RAVE) {
LeatherArmorMeta laMeta = (LeatherArmorMeta) itemMeta;
Color color = Color.RED;
if(suitType == SuitType.RAVE) {
int r = MathUtils.random(255);
int g = MathUtils.random(255);
int b = MathUtils.random(255);
color = Color.fromRGB(r, g, b);
}
laMeta.setColor(color);
}
List<String> loreList = new ArrayList<>();
if (suitType.showsDescription()) {
loreList.add("");
loreList.addAll(suitType.getDescription());
loreList.add("");
}
if (SettingsManager.getConfig().getBoolean("No-Permission.Show-In-Lore")) {
String yesOrNo = player.hasPermission(suitType.getPermission(armorSlot)) ? "Yes" : "No";
String s = SettingsManager.getConfig().getString("No-Permission.Lore-Message-" + yesOrNo);
loreList.add(ChatColor.translateAlternateColorCodes('&', s));
}
itemMeta.setLore(loreList);
is.setItemMeta(itemMeta);
is = filterItem(is, suitType, player);
putItem(inventory, slot, is, (data) -> {
UltraPlayer ultraPlayer = data.getClicker();
ItemStack clicked = data.getClicked();
int currentPage = getCurrentPage(ultraPlayer);
if (UltraCosmeticsData.get().shouldCloseAfterSelect()) {
ultraPlayer.getBukkitPlayer().closeInventory();
}
if (clicked.getItemMeta().getDisplayName().startsWith(CATEGORY.getDeactivateMenu())) {
toggleOff(ultraPlayer, armorSlot);
if (!UltraCosmeticsData.get().shouldCloseAfterSelect()) {
open(ultraPlayer, currentPage);
}
} else if (clicked.getItemMeta().getDisplayName().startsWith(CATEGORY.getActivateMenu())) {
StringBuilder sb = new StringBuilder();
String name = clicked.getItemMeta().getDisplayName().replaceFirst(CATEGORY.getActivateMenu(), "");
int j = name.split(" ").length;
if (name.contains("(")) {
j--;
}
for (int k = 1; k < j; k++) {
sb.append(name.split(" ")[k]);
try {
if (clicked.getItemMeta().getDisplayName().split(" ")[k + 1] != null) {
sb.append(" ");
}
} catch (Exception ignored) {
}
}
toggleOn(ultraPlayer, suitType, getUltraCosmetics(), armorSlot);
}
});
}
i++;
}
// Previous page item.
if (page > 1) {
MaterialData materialData = ItemFactory.createFromConfig("Categories.Previous-Page-Item");
int finalPage = page;
putItem(inventory, getSize() - 9, ItemFactory.create(materialData.getItemType(), materialData.getData(),
MessageManager.getMessage("Menu.Previous-Page")), (data) -> open(player, finalPage - 1));
}
// Next page item.
if (page < getMaxPages()) {
MaterialData materialData = ItemFactory.createFromConfig("Categories.Next-Page-Item");
int finalPage = page;
putItem(inventory, getSize() - 1, ItemFactory.create(materialData.getItemType(), materialData.getData(),
MessageManager.getMessage("Menu.Next-Page")), (data) -> open(player, finalPage + 1));
}
// Clear cosmetic item.
MaterialData materialData = ItemFactory.createFromConfig("Categories.Clear-Cosmetic-Item");
String message = MessageManager.getMessage(CATEGORY.getClearConfigPath());
ItemStack itemStack = ItemFactory.create(materialData.getItemType(), materialData.getData(), message);
int finalPage1 = page;
putItem(inventory, inventory.getSize() - 4, itemStack, data -> {
toggleOff(player);
open(player, finalPage1);
});
putItems(inventory, player, page);
ItemFactory.fillInventory(inventory);
player.getBukkitPlayer().openInventory(inventory);
}
@Override
protected int getSize() {
return 54;
}
/**
* @return The name of the menu.
*/
@Override
protected String getName() {
return MessageManager.getMessage("Menus." + CATEGORY.getConfigPath());
}
@Override
protected void putItems(Inventory inventory, UltraPlayer ultraPlayer, int page) {
// Go Back to Main Menu Arrow.
if (getCategory().hasGoBackArrow()) {
MaterialData backData = ItemFactory.createFromConfig("Categories.Back-Main-Menu-Item");
String message = MessageManager.getMessage("Menu.Main-Menu");
ItemStack item = ItemFactory.create(backData.getItemType(), backData.getData(), message);
putItem(inventory, inventory.getSize() - 6, item, (data) -> getUltraCosmetics().openMainMenu(ultraPlayer));
}
}
@Override
public List<SuitType> enabled() {
return SuitType.enabled();
}
@Override
protected void toggleOn(UltraPlayer ultraPlayer, SuitType suitType, UltraCosmetics ultraCosmetics) {
suitType.equip(ultraPlayer, ultraCosmetics, ArmorSlot.CHESTPLATE);
}
protected void toggleOn(UltraPlayer ultraPlayer, SuitType suitType, UltraCosmetics ultraCosmetics, ArmorSlot armorSlot) {
suitType.equip(ultraPlayer, ultraCosmetics, armorSlot);
}
protected void toggleOff(UltraPlayer ultraPlayer, ArmorSlot armorSlot) {
ultraPlayer.removeSuit(armorSlot);
}
@Override
protected void toggleOff(UltraPlayer ultraPlayer) {
ultraPlayer.removeSuit();
}
@Override
protected Cosmetic getCosmetic(UltraPlayer ultraPlayer) {
return ultraPlayer.getSuit(ArmorSlot.CHESTPLATE);
}
@Override
protected int getItemsPerPage() {
return 7;
}
}