package eu.mrneznamy.mrultimatelibrary.gui;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * Paged GUI with navigation
 */
public class MrLibPagedGUI extends MrLibGUI {
    
    private final List<ItemStack> items;
    private final List<Consumer<Player>> itemActions;
    private int currentPage = 0;
    private final int itemsPerPage;
    private final int[] itemSlots;
    
    /**
     * Create paged GUI
     * 
     * @param title Title
     * @param rows Rows (recommended 6 for navigation)
     */
    public MrLibPagedGUI(String title, int rows) {
        super(title, rows);
        this.items = new ArrayList<>();
        this.itemActions = new ArrayList<>();
        this.itemsPerPage = (rows - 1) * 9; 
        this.itemSlots = new int[itemsPerPage];
        
        
        for (int i = 0; i < itemsPerPage; i++) {
            itemSlots[i] = i;
        }
        
        setupNavigation();
    }
    
    /**
     * Add item to pages
     * 
     * @param item ItemStack
     * @param action Action when clicked
     * @return this
     */
    public MrLibPagedGUI addPageItem(ItemStack item, Consumer<Player> action) {
        items.add(item);
        itemActions.add(action);
        return this;
    }
    
    /**
     * Update page display
     */
    private void updatePage() {
        
        for (int slot : itemSlots) {
            setItem(slot, null);
        }
        
        int start = currentPage * itemsPerPage;
        int end = Math.min(start + itemsPerPage, items.size());
        
        for (int i = start; i < end; i++) {
            int slot = itemSlots[i - start];
            int index = i; 
            
            setItem(slot, items.get(i), event -> {
                if (itemActions.get(index) != null) {
                    itemActions.get(index).accept((Player) event.getWhoClicked());
                }
            });
        }
        
        updateNavigationButtons();
    }
    
    /**
     * Setup navigation buttons
     */
    private void setupNavigation() {
        int lastRow = getSize() - 9;
        
        
        ItemStack prevButton = createNavigationItem(Material.ARROW, "&cPrevious Page");
        setItem(lastRow + 3, prevButton, event -> {
            if (currentPage > 0) {
                currentPage--;
                updatePage();
            }
        });
        
        
        ItemStack nextButton = createNavigationItem(Material.ARROW, "&aNext Page");
        setItem(lastRow + 5, nextButton, event -> {
            if (hasNextPage()) {
                currentPage++;
                updatePage();
            }
        });
        
        
        ItemStack closeButton = createNavigationItem(Material.BARRIER, "&cClose");
        setItem(lastRow + 4, closeButton, event -> {
            event.getWhoClicked().closeInventory();
        });
    }
    
    /**
     * Update navigation button states
     */
    private void updateNavigationButtons() {
        int lastRow = getSize() - 9;
        
        
        Material prevMaterial = currentPage > 0 ? Material.ARROW : Material.GRAY_DYE;
        setItem(lastRow + 3, createNavigationItem(prevMaterial, "&cPrevious Page"));
        
        
        Material nextMaterial = hasNextPage() ? Material.ARROW : Material.GRAY_DYE;
        setItem(lastRow + 5, createNavigationItem(nextMaterial, "&aNext Page"));
        
        
        int totalPages = (int) Math.ceil((double) items.size() / itemsPerPage);
        ItemStack pageInfo = createNavigationItem(Material.PAPER, 
            "&ePage " + (currentPage + 1) + "/" + Math.max(1, totalPages));
        setItem(lastRow + 4, pageInfo);
    }
    
    /**
     * Check if there's next page
     */
    private boolean hasNextPage() {
        return (currentPage + 1) * itemsPerPage < items.size();
    }
    
    /**
     * Create navigation item
     */
    private ItemStack createNavigationItem(Material material, String name) {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        if (meta != null) {
            meta.setDisplayName(name.replace("&", "§"));
            item.setItemMeta(meta);
        }
        return item;
    }
    
    /**
     * Open GUI and show first page
     */
    @Override
    public void open(Player player) {
        currentPage = 0;
        updatePage();
        super.open(player);
    }
}

