package eu.mrneznamy.mrultimatelibrary.gui;

import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Manager for tracking open GUIs
 */
public class MrLibGUIManager implements Listener {
    
    private static final Map<UUID, MrLibGUI> openGUIs = new HashMap<>();
    
    /**
     * Register GUI for player
     */
    public static void registerGUI(Player player, MrLibGUI gui) {
        openGUIs.put(player.getUniqueId(), gui);
    }
    
    /**
     * Unregister GUI for player
     */
    public static void unregisterGUI(Player player) {
        openGUIs.remove(player.getUniqueId());
    }
    
    /**
     * Get GUI for player
     */
    public static MrLibGUI getGUI(Player player) {
        return openGUIs.get(player.getUniqueId());
    }
    
    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (!(event.getWhoClicked() instanceof Player)) {
            return;
        }
        
        Player player = (Player) event.getWhoClicked();
        MrLibGUI gui = openGUIs.get(player.getUniqueId());
        
        if (gui != null && event.getInventory().equals(gui.getInventory())) {
            try {
                gui.handleClick(event);
            } catch (Throwable t) {
                try {
                    String slug = "mrultimatelibrary";
                    if (eu.mrneznamy.mrultimatelibrary.MrUltimateLibrary.getInstance() != null) {
                        slug = eu.mrneznamy.mrultimatelibrary.MrUltimateLibrary.getInstance().getName().toLowerCase();
                    }
                    eu.mrneznamy.mrultimatelibrary.MrUltimateLibrary.reportError(slug, t, "Error in GUI handleClick");
                } catch (Throwable ignored) {}
            }
        }
    }
    
    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        if (!(event.getPlayer() instanceof Player)) {
            return;
        }
        
        Player player = (Player) event.getPlayer();
        MrLibGUI gui = openGUIs.get(player.getUniqueId());
        
        if (gui != null && event.getInventory().equals(gui.getInventory())) {
            gui.handleClose(event);
            unregisterGUI(player);
        }
    }
}

