package shop.morpheusnox.backpackInfinita;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class BackpackListener implements Listener {

    private final BackpackInfinita plugin;

    public BackpackListener(BackpackInfinita plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (!event.getView().getTitle().equals("Mochila")) {
            return;
        }

        if (event.getCurrentItem() == null || event.getCurrentItem().getType().isAir()) {
            return;
        }

        Player player = (Player) event.getWhoClicked();
        Backpack backpack = plugin.getPlayerBackpack(player);

        event.setCancelled(true);
        ItemStack clickedItem = event.getCurrentItem().clone();

        // Lida com cliques nos botões de navegação
        if (event.getClickedInventory() == event.getView().getTopInventory()) {
            if (event.getSlot() == 45) { // Botão Página Anterior
                backpack.previousPage();
                plugin.savePlayerBackpack(player.getUniqueId(), backpack);
                backpack.open();
                return;
            } else if (event.getSlot() == 53) { // Botão Próxima Página
                backpack.nextPage();
                plugin.savePlayerBackpack(player.getUniqueId(), backpack);
                backpack.open();
                return;
            } else if (event.getSlot() == 49) { // Botão Informação da Página
                return; // Não interativo
            }
        }

        // Lógica de transferência de itens
        if (event.getClickedInventory() == event.getView().getTopInventory()) {
            // Clicado na mochila (movendo para o inventário do jogador)
            int internalIndex = backpack.getCurrentPage() * Backpack.ITEMS_PER_PAGE + event.getSlot();
            if (internalIndex >= backpack.getInternalContents().size()) {
                return; // Clicou em um slot vazio na página atual
            }

            ItemStack trueItem = backpack.getInternalContents().get(internalIndex).clone();

            ItemStack itemToTransfer = trueItem.clone();
            // Remove o lore antes de transferir para o inventário do jogador
            ItemMeta meta = itemToTransfer.getItemMeta();
            if (meta != null) {
                if (meta.hasLore()) {
                    List<String> lore = meta.getLore();
                    lore.removeIf(line -> line.startsWith("§7Quantidade:"));
                    meta.setLore(lore);
                }
                if (meta.hasDisplayName()) {
                    meta.setDisplayName(null);
                }
                itemToTransfer.setItemMeta(meta);
            }

            int amountToTransfer = itemToTransfer.getMaxStackSize();
            if (event.isShiftClick()) {
                amountToTransfer = trueItem.getAmount();
            }

            itemToTransfer.setAmount(amountToTransfer);

            // Tenta adicionar ao inventário do jogador
            int remaining = player.getInventory().addItem(itemToTransfer).values().stream()
                    .mapToInt(ItemStack::getAmount).sum();

            if (remaining < amountToTransfer) {
                // Alguns itens foram transferidos
                ItemStack removedFromBackpack = trueItem.clone();
                removedFromBackpack.setAmount(amountToTransfer - remaining);
                backpack.removeItem(removedFromBackpack);
            }

        } else {
            // Clicado no inventário do jogador (movendo para a mochila)
            backpack.addItem(clickedItem);
            event.getWhoClicked().getInventory().removeItem(clickedItem);
        }

        // Atualiza a GUI da mochila
        backpack.open();
        plugin.savePlayerBackpack(player.getUniqueId(), backpack);
    }

    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        if (!event.getView().getTitle().equals("Mochila")) {
            return;
        }

        Player player = (Player) event.getPlayer();
        Backpack backpack = plugin.getPlayerBackpack(player);
        plugin.savePlayerBackpack(player.getUniqueId(), backpack);
    }

    @EventHandler
    public void onPlayerQuit(PlayerQuitEvent event) {
        Player player = event.getPlayer();
        Backpack backpack = plugin.getPlayerBackpack(player);
        plugin.savePlayerBackpack(player.getUniqueId(), backpack);
        plugin.removePlayerBackpack(player.getUniqueId());
    }
}