package org.pixeltime.enchantmentsenhance.gui;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory;

public class GUIListener implements Listener {
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onClick(InventoryClickEvent e) {
        // Handles invalid clicks.
        if (e.getSlot() < 0) {
            return;
        }
        // Handles invalid entity.
        if (!(e.getWhoClicked() instanceof Player)) {
            return;
        }
        // Handles empty slot.
        if (e.getCurrentItem() != null && e.getCurrentItem().getType() == (Material.AIR)) {
            return;
        }
        // Handles non-gui inventory.
        if (e.getRawSlot() > 53) {
            return;
        }

        Player player = (Player) e.getWhoClicked();
        String playerName = player.getName();
        GUIAbstract gui = GUIManager.getMap().get(playerName);
        if (gui != null && gui.getInventory().equals(e.getInventory())) {
            e.setCancelled(true);
            GUIAbstract.GUIAction action = gui.getActions().get(e.getSlot());
            if (action != null) {
                action.click(e.getClick());
                gui.update();
            }
        } else {
            if (isCreatedGUI(e.getInventory())) {
                e.setCancelled(true);
                player.closeInventory();
            }
        }
    }


    /**
     * Prevents item glitched into menu.
     *
     * @param e
     */
    @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH)
    public void onInventoryClick(InventoryClickEvent e) {
        if ((e.getInventory().getType() != InventoryType.CRAFTING) && (e.getInventory().getType() != InventoryType.PLAYER)) {
            if ((e.getClick().equals(ClickType.NUMBER_KEY)) && (e.getWhoClicked().getInventory().getItem(e.getHotbarButton()) != null)) {
                Player player = (Player) e.getWhoClicked();
                String playerName = player.getName();
                GUIAbstract gui = GUIManager.getMap().get(playerName);
                if (gui != null && gui.getInventory().equals(e.getInventory())) {
                    e.setCancelled(true);
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.MONITOR)
    public void onClose(InventoryCloseEvent e) {
        Player player = (Player) e.getPlayer();
        String playerName = player.getName();
        GUIManager.getMap().remove(playerName);
    }


    @EventHandler(priority = EventPriority.MONITOR)
    public void onQuit(PlayerQuitEvent e) {
        Player player = e.getPlayer();
        String playerName = player.getName();
        GUIManager.getMap().remove(playerName);
    }

    public boolean isCreatedGUI(Inventory inventory) {
        for (GUIAbstract inv : GUIManager.getSet()) {
            if (inventory.equals(inv.getInventory())) {
                return true;
            }
        }
        return false;
    }
}