package de.fanta.challenges.guis.eventgui;

import de.fanta.challenges.Challenges;
import de.fanta.challenges.utils.guiutils.GUIUtils;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;

import java.util.Objects;

public class EventGui implements Listener {

    private static final Challenges plugin = Challenges.getPlugin();

    public static final int INVENTORY_SIZE = 27;
    public static final Inventory EVENT_GUI = Bukkit.createInventory(null, INVENTORY_SIZE, Challenges.GUIPREFIX + " >> Event Settings");

    private static final int NULL_EVENT_INDEX = 0;
    private static final int BINGO_EVENT_INDEX = 10;
    private static final int BINGO_ITEMS_INDEX = 19;
    private static final int BUILD_EVENT_INDEX = 12;
    private static final int XP_EVENT_INDEX = 11;
    private static final int CLOSE_IDEX = 26;

    public static void createEventGUI(Player p) {
        if (Objects.equals(plugin.getConfig().getString("event.type"), "bingo")) {
            EVENT_GUI.setItem(BINGO_EVENT_INDEX, GUIUtils.createGuiItem(Material.PINK_SHULKER_BOX, ChatColor.GREEN + "Bingo Event", true, ChatColor.GREEN + "Sammle Vorgegebene Items", ChatColor.GREEN + "Items kann man mit /bingo sehen"));
            EVENT_GUI.setItem(BINGO_ITEMS_INDEX, GUIUtils.createGuiItem(Material.CHEST, ChatColor.GREEN + "Items", ChatColor.GREEN + "Anklicken um Items Hinzuzufügen"));
        } else {
            EVENT_GUI.setItem(BINGO_EVENT_INDEX, GUIUtils.createGuiItem(Material.PINK_SHULKER_BOX, ChatColor.RED + "Bingo Event", ChatColor.GREEN + "Sammle Vorgegebene Items", ChatColor.GREEN + "Items kann man mit /bingo sehen"));
            EVENT_GUI.setItem(BINGO_ITEMS_INDEX, GUIUtils.EMPTY_ICON);
        }
        if (!Objects.equals(plugin.getConfig().getString("event.type"), "nix")) {
            EVENT_GUI.setItem(NULL_EVENT_INDEX, GUIUtils.createGuiItem(Material.BARRIER, ChatColor.RED + "Event beenden"));
        } else {
            EVENT_GUI.setItem(NULL_EVENT_INDEX, GUIUtils.EMPTY_ICON);
        }
        if (Objects.equals(plugin.getConfig().getString("event.type"), "build")) {
            EVENT_GUI.setItem(BUILD_EVENT_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_PICKAXE, ChatColor.GREEN + "Build Event", true, ChatColor.GREEN + "Baue so viele Blöcke wie möglich ab", ChatColor.RED + "Einen Block setzen gibt einen Minus Punkt"));
        } else {
            EVENT_GUI.setItem(BUILD_EVENT_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_PICKAXE, ChatColor.RED + "Build Event", ChatColor.GREEN + "Baue so viele Blöcke wie möglich ab", ChatColor.RED + "Einen Block setzen gibt einen Minus Punkt"));
        }
        if (Objects.equals(plugin.getConfig().getString("event.type"), "xp")) {
            EVENT_GUI.setItem(XP_EVENT_INDEX, GUIUtils.createGuiItem(Material.ENCHANTING_TABLE, ChatColor.GREEN + "XP Event", true, ChatColor.GREEN + "Sammle so viel XP wie Möglich", ChatColor.RED + "Verzaubern zieht Level ab"));
        } else {
            EVENT_GUI.setItem(XP_EVENT_INDEX, GUIUtils.createGuiItem(Material.ENCHANTING_TABLE, ChatColor.RED + "XP Event", ChatColor.GREEN + "Sammle so viel XP wie Möglich", ChatColor.RED + "Verzaubern zieht Level ab"));
        }
        EVENT_GUI.setItem(CLOSE_IDEX, GUIUtils.createGuiItem(Material.BARRIER, ChatColor.RED + "Menü verlassen!"));
        for (int i = 0; i < INVENTORY_SIZE; i++) {
            if (EVENT_GUI.getItem(i) == null || EVENT_GUI.getItem(i).getType() == Material.AIR) {
                EVENT_GUI.setItem(i, GUIUtils.EMPTY_ICON);
            }
        }
        p.openInventory(EVENT_GUI);
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        int slot = e.getRawSlot();
        Player p = (Player) e.getWhoClicked();
        if (e.getInventory() == EVENT_GUI) {
            if (plugin.getConfig().getBoolean("event.enabled")) {
                switch (slot) {
                    case NULL_EVENT_INDEX:
                        plugin.getScoreManager().saveScores(p);
                        plugin.getScoreManager().resetScores();
                        GUIUtils.setConfig("event.type", "nix");
                        GUIUtils.sendTitleToAll("Event", "Event beendet", ChatColor.RED);
                        break;
                    case BUILD_EVENT_INDEX:
                        GUIUtils.setConfig("event.type", "build");
                        GUIUtils.sendTitleToAll("Event", "Baue die meisten Blöcke ab!", ChatColor.GREEN);
                        break;
                    case XP_EVENT_INDEX:
                        GUIUtils.setConfig("event.type", "xp");
                        GUIUtils.sendTitleToAll("Event", "Sammle so viel XP wie möglich ein!", ChatColor.GREEN);
                        break;
                    case BINGO_EVENT_INDEX:
                        GUIUtils.setConfig("event.type", "bingo");
                        GUIUtils.sendTitleToAll("Event", "Sammle Vorgegebene Items! (/bingo)", ChatColor.GREEN);
                }
                createEventGUI(p);

                switch (slot) {
                    case BINGO_ITEMS_INDEX -> EventItemsGui.openEventGUI(p);
                    case CLOSE_IDEX -> p.closeInventory();
                }
            }
            e.setCancelled(true);
        }
    }
}


