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);
                }
                // Preserva o display name customizado
                itemToTransfer.setItemMeta(meta);
            }

            int amountToTransfer = 1; // Clique normal: 1 item
            if (event.isShiftClick()) {
                amountToTransfer = trueItem.getAmount(); // Shift-click: stack todo
            }
            amountToTransfer = Math.min(amountToTransfer, trueItem.getAmount());

            itemToTransfer.setAmount(amountToTransfer);

            if (event.isShiftClick()) {
                // Shift-click: move diretamente para o inventário
                int remaining = player.getInventory().addItem(itemToTransfer).values().stream()
                        .mapToInt(ItemStack::getAmount).sum();

                if (remaining < amountToTransfer) {
                    // Alguns itens foram transferidos
                    if (trueItem.getType().name().contains("SHULKER_BOX")) {
                        // Para shulker boxes, remover por index para evitar remover a errada
                        backpack.getInternalContents().remove(internalIndex);
                    } else {
                        ItemStack removedFromBackpack = trueItem.clone();
                        removedFromBackpack.setAmount(amountToTransfer - remaining);
                        backpack.removeItem(removedFromBackpack);
                    }
                }
            } else {
                // Clique normal: move para o cursor
                if (event.getCursor() == null || event.getCursor().getType().isAir()) {
                    event.getWhoClicked().setItemOnCursor(itemToTransfer);
                    // Remove da mochila
                    if (trueItem.getType().name().contains("SHULKER_BOX")) {
                        backpack.getInternalContents().remove(internalIndex);
                    } else {
                        ItemStack removedFromBackpack = trueItem.clone();
                        removedFromBackpack.setAmount(amountToTransfer);
                        backpack.removeItem(removedFromBackpack);
                    }
                } else {
                    // Se há item no cursor, adiciona ao inventário
                    int remaining = player.getInventory().addItem(itemToTransfer).values().stream()
                            .mapToInt(ItemStack::getAmount).sum();

                    if (remaining < amountToTransfer) {
                        if (trueItem.getType().name().contains("SHULKER_BOX")) {
                            backpack.getInternalContents().remove(internalIndex);
                        } else {
                            ItemStack removedFromBackpack = trueItem.clone();
                            removedFromBackpack.setAmount(amountToTransfer - remaining);
                            backpack.removeItem(removedFromBackpack);
                        }
                    }
                }
            }

        } else {
            // Clicado no inventário do jogador
            if (event.getCursor() != null && !event.getCursor().getType().isAir()) {
                // Há item no cursor: colocar no slot clicado
                ItemStack cursorItem = event.getCursor().clone();
                int amountToPlace = cursorItem.getAmount();
                if (event.getClick().name().contains("RIGHT")) {
                    amountToPlace = 1; // Clique direito: 1 item
                }
                cursorItem.setAmount(amountToPlace);
                event.getClickedInventory().setItem(event.getSlot(), cursorItem);
                // Reduz do cursor
                ItemStack newCursor = event.getCursor().clone();
                newCursor.setAmount(newCursor.getAmount() - amountToPlace);
                if (newCursor.getAmount() <= 0) {
                    newCursor = null;
                }
                event.getWhoClicked().setItemOnCursor(newCursor);
            } else {
                // Sem item no cursor: mover do inventário para mochila
                if (event.isShiftClick()) {
                    // Shift-click: move diretamente
                    backpack.addItem(clickedItem);
                    event.getWhoClicked().getInventory().removeItem(clickedItem);
                } else {
                    // Clique normal: move para o cursor
                    event.getWhoClicked().setItemOnCursor(clickedItem.clone());
                    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());
    }
}