package de.fanta.challenges.guis.savegui;
import de.fanta.challenges.Challenges;
import de.fanta.challenges.SaveSlot;
import de.fanta.challenges.ServerType;
import de.fanta.challenges.utils.ChatUtil;
import de.fanta.challenges.utils.SaveWorldUtils;
import de.fanta.challenges.utils.ItemUtils;
import de.iani.cubesideutils.StringUtil;
import de.iani.cubesideutils.bukkit.inventory.AbstractWindow;
import de.iani.playerUUIDCache.CachedPlayer;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
public class ChallengeSaveGui extends AbstractWindow {
private static final Challenges plugin = Challenges.getPlugin();
private static final int SAVE_1_INDEX = 1;
private static final int SAVE_2_INDEX = 3;
private static final int SAVE_3_INDEX = 5;
private static final int SAVE_AUTO_INDEX = 7;
private static final int WINDOW_SIZE = 9;
private static final HashMap<UUID, UUID> savePlayerList = new HashMap<>();
public ChallengeSaveGui(Player player, CachedPlayer savePlayer) {
super(player, Bukkit.createInventory(null, WINDOW_SIZE, plugin.getGuiPrefix().append(Component.text(" >> Map speichern"))));
savePlayerList.put(player.getUniqueId(), savePlayer.getUniqueId());
}
@Override
protected void rebuildInventory() {
Player player = getPlayer();
UUID savePlayerID = savePlayerList.get(player.getUniqueId());
File save1;
File save2;
File save3;
File saveAuto;
if (plugin.getServerType() != ServerType.ADVENTURE) {
save1 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/1");
save2 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/2");
save3 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/3");
saveAuto = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/autosave");
} else {
save1 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/1");
save2 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/2");
save3 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/3");
saveAuto = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/autosave");
}
for (int i = 0; i < WINDOW_SIZE; i++) {
ItemStack item;
switch (i) {
case SAVE_1_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_1, save1);
case SAVE_2_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_2, save2);
case SAVE_3_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_3, save3);
case SAVE_AUTO_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_AUTO, saveAuto);
default -> item = ItemUtils.EMPTY_ICON;
}
this.getInventory().setItem(i, item);
}
}
@Override
public void onItemClicked(InventoryClickEvent event) {
Player player = getPlayer();
if (!mayAffectThisInventory(event)) {
return;
}
event.setCancelled(true);
if (!getInventory().equals(event.getClickedInventory())) {
return;
}
Player p = getPlayer();
UUID savePlayerID = savePlayerList.get(p.getUniqueId());
File save1;
File save2;
File save3;
if (plugin.getServerType() != ServerType.ADVENTURE) {
save1 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/1");
save2 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/2");
save3 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/3");
} else {
save1 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/1");
save2 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/2");
save3 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/3");
}
int slot = event.getSlot();
switch (slot) {
case SAVE_1_INDEX -> {
if (!p.hasPermission("challenge.save.slot1")) {
ChatUtil.sendErrorMessage(p, "Für diesen Slot hast du keine Rechte!");
return;
}
if (!save1.isDirectory()) {
player.closeInventory();
SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_1);
return;
}
new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_1, event.getCurrentItem()).open();
}
case SAVE_2_INDEX -> {
if (!p.hasPermission("challenge.save.slot2")) {
ChatUtil.sendErrorMessage(p, "Für diesen Slot brauchst du VIP!");
return;
}
if (!save2.isDirectory()) {
player.closeInventory();
SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_2);
return;
}
new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_2, event.getCurrentItem()).open();
}
case SAVE_3_INDEX -> {
if (!p.hasPermission("challenge.save.slot3")) {
ChatUtil.sendErrorMessage(p, "Für diesen Slot brauchst du VIP!");
return;
}
if (!save3.isDirectory()) {
player.closeInventory();
SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_3);
return;
}
new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_3, event.getCurrentItem()).open();
}
default -> {
}
}
}
private static String getFileDate(YamlConfiguration serverConfig) {
return StringUtil.formatDate(serverConfig.getLong("saveTime", 0));
}
private static ItemStack getDisplayItem(Player player, SaveSlot saveSlot, File save) {
ItemStack item;
if (player.hasPermission(saveSlot.getPermission())) {
if (save.isDirectory()) {
File mapConfig = new File(save, "/Challenges/serverconfig.yml");
Material displayItem = null;
String displayName = null;
YamlConfiguration serverConfig = new YamlConfiguration();
try {
serverConfig.load(mapConfig);
String itemType = serverConfig.getString("displayItem.item");
String itemName = serverConfig.getString("displayItem.name");
if (itemType != null) {
try {
displayItem = Material.valueOf(itemType);
} catch (IllegalArgumentException ignore) {
}
}
if (itemName != null) {
displayName = itemName;
}
} catch (IOException | InvalidConfigurationException ex) {
plugin.getLogger().log(Level.SEVERE, "Fehler beim laden der config", ex);
}
ItemStack stack = new ItemStack(displayItem != null ? displayItem : Material.MAP);
ItemMeta meta = stack.getItemMeta();
meta.displayName(displayName != null ? Component.text(displayName) : Component.text("Save " + saveSlot.getSlot(), ChatUtil.GREEN));
if (saveSlot == SaveSlot.SLOT_AUTO) {
meta.lore(List.of(Component.text("AutoSave kann nicht überschrieben werden!", ChatUtil.RED), Component.text("Gespeichert am " + getFileDate(serverConfig), ChatUtil.GREEN)));
} else {
meta.lore(List.of(Component.text("Gespeichert am " + getFileDate(serverConfig), ChatUtil.GREEN)));
}
stack.setItemMeta(meta);
item = stack;
} else {
item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", ChatUtil.GREEN));
}
} else {
item = ItemUtils.createGuiItem(Material.BARRIER, Component.text("Für diesen Slot brauchst du VIP", ChatUtil.RED));
}
return item;
}
}