package de.viper.survivalplus.gui;

import de.viper.survivalplus.Manager.ShopManager;
import de.viper.survivalplus.SurvivalPlus;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
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 org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.Arrays;

public class ShopGui implements Listener {

    private final ShopManager shopManager;
    private final Player player;
    private Inventory inv;
    private final SurvivalPlus plugin;

    public ShopGui(SurvivalPlus plugin, Player player, ShopManager shopManager) {
        this.plugin = plugin;
        this.player = player;
        this.shopManager = shopManager;
        createInventory();
    }

    private void createInventory() {
        inv = Bukkit.createInventory(null, 27, "Shop");

        if (shopManager.getShopConfig().getConfigurationSection("items") == null) {
            player.sendMessage(ChatColor.RED + "Der Shop ist momentan leer.");
            return;
        }

        // Alle Items aus shop.yml einlesen
        for (String itemKey : shopManager.getShopConfig().getConfigurationSection("items").getKeys(false)) {
            Material mat = getMaterialFromKey(itemKey);
            if (mat == null) {
                continue; // Unbekannte Materialien einfach überspringen
            }

            addShopItem(itemKey, mat, 64);
            addShopItem(itemKey, mat, 16);
            addShopItem(itemKey, mat, 1);
        }

        player.openInventory(inv);
    }

    private Material getMaterialFromKey(String key) {
        try {
            return Material.valueOf(key.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    private void addShopItem(String itemKey, Material material, int amount) {
        double pricePerUnit = shopManager.getCurrentPrice(itemKey);
        int currentStock = shopManager.getStock(itemKey);
        double totalPrice = pricePerUnit * amount;

        ItemStack item = new ItemStack(material, amount);
        ItemMeta meta = item.getItemMeta();
        if (meta != null) {
            meta.setDisplayName(ChatColor.GREEN.toString() + amount + "x " + material.name());
            meta.setLore(Arrays.asList(
                    ChatColor.GRAY + "Lagerbestand: " + ChatColor.YELLOW + currentStock,
                    ChatColor.YELLOW + "Preis pro Stück: " + pricePerUnit,
                    ChatColor.YELLOW + "Gesamtpreis: " + totalPrice,
                    "",
                    ChatColor.GREEN + "Linksklick zum Kaufen",
                    ChatColor.RED + "Rechtsklick zum Verkaufen"
            ));
            item.setItemMeta(meta);
        }

        for (int i = 0; i < inv.getSize(); i++) {
            if (inv.getItem(i) == null) {
                inv.setItem(i, item);
                break;
            }
        }
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        if (!e.getView().getTitle().equals("Shop")) return;
        if (e.getClickedInventory() == null) return;
        if (!e.getWhoClicked().equals(player)) return;

        e.setCancelled(true);

        ItemStack clicked = e.getCurrentItem();
        if (clicked == null || clicked.getType() == Material.AIR) return;

        int amount = clicked.getAmount();
        Material mat = clicked.getType();
        String itemKey = mat.name().toLowerCase();

        if (e.isLeftClick()) {
            // --- KAUFEN ---
            if (!shopManager.buyItem(itemKey, amount)) {
                player.sendMessage(ChatColor.RED + "Nicht genügend Bestand im Shop.");
                return;
            }

            double totalPrice = shopManager.getCurrentPrice(itemKey) * amount;

            // TODO: Economy Abzug hier einfügen!
            // Beispiel: if (!economy.withdrawPlayer(player, totalPrice)) { ... }

            player.getInventory().addItem(new ItemStack(mat, amount));
            player.sendMessage(ChatColor.GREEN + "Du hast " + amount + "x " + mat.name() + " für " + String.format("%.2f", totalPrice) + " gekauft.");

        } else if (e.isRightClick()) {
            // --- VERKAUFEN ---
            
            // Prüfen ob Spieler genug Items hat
            if (!player.getInventory().containsAtLeast(new ItemStack(mat), amount)) {
                player.sendMessage(ChatColor.RED + "Du hast nicht genug Items zum Verkaufen.");
                return;
            }

            // Verkaufslogik
            shopManager.sellItem(itemKey, amount);
            
            double sellPrice = shopManager.getCurrentPrice(itemKey) * amount; // Neuer Preis nach dem Verkauf wird genutzt
            // Hinweis: In echten Systemen bekommt man oft den Preis *vor* dem Preisverfall, hier nehmen wir den neuen für Einfachheit oder den gespeicherten:
            // Besser wäre: double oldPrice = price * amount; ... player.giveMoney(oldPrice);
            
            // TODO: Economy Gutschrift hier einfügen!
            
            player.getInventory().removeItem(new ItemStack(mat, amount));
            player.sendMessage(ChatColor.GREEN + "Du hast " + amount + "x " + mat.name() + " für " + String.format("%.2f", sellPrice) + " verkauft.");
        }

        // Inventory schließen, um Preise neu zu laden und Bugs zu vermeiden
        player.closeInventory();
        // Optional: direkt neu öffnen mit createInventory() wenn es flüssig sein soll
        // createInventory(); 
    }

    @EventHandler
    public void onInventoryClose(InventoryCloseEvent e) {
        if (e.getView().getTitle().equals("Shop") && e.getPlayer().equals(player)) {
            // Listener kann entladen werden, wenn nicht mehr gebraucht
            // HandlerList.unregisterAll(this); // Vorsicht: falls Singleton, sonst fliegt allen der GUI weg
        }
    }

    public Inventory getInventory() {
        return inv;
    }
}