package de.viper.survivalplus.commands;

import de.viper.survivalplus.Manager.ShopManager;
import de.viper.survivalplus.SurvivalPlus;
import de.viper.survivalplus.gui.ShopGui;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.plugin.RegisteredServiceProvider;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;

public class ShopCommand implements CommandExecutor {

    private final ShopManager shopManager;
    private final SurvivalPlus plugin;
    private Economy economy;

    public ShopCommand(SurvivalPlus plugin) {
        this.plugin = plugin;
        this.shopManager = new ShopManager(plugin);
        
        // Economy laden (für Admin-Verkauf an Server)
        try {
            if (Bukkit.getPluginManager().isPluginEnabled("Vault")) {
                RegisteredServiceProvider<Economy> rsp = Bukkit.getServicesManager().getRegistration(Economy.class);
                if (rsp != null) {
                    this.economy = rsp.getProvider();
                    plugin.getLogger().info("Vault Economy für ShopCommand gefunden.");
                }
            }
        } catch (Exception e) {
            // Ignorieren wenn Vault fehlt
        }
    }

    private String getMessage(String key) {
        return plugin.getMessage("shop." + key);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage(getMessage("only-players"));
            return true;
        }
        Player player = (Player) sender;

        // Shop-GUI öffnen
        if (args.length == 0 || (args.length > 0 && args[0].equalsIgnoreCase("gui"))) {
            ShopGui shopGui = new ShopGui(plugin, player, shopManager);
            Bukkit.getPluginManager().registerEvents(shopGui, plugin);
            player.openInventory(shopGui.getInventory());
            return true;
        }

        // --- SHOP ADD LOGIK ---
        if (args.length >= 4 && args[0].equalsIgnoreCase("add")) {
            
            // Economy-Check
            if (economy == null) {
                sender.sendMessage(ChatColor.RED + "Vault Economy ist nicht verfügbar!");
                return true;
            }

            String materialName = args[1];
            String priceStr = args[2];
            String amountStr = args[3];

            Material mat = Material.matchMaterial(materialName);
            
            if (mat == null) {
                sender.sendMessage(ChatColor.RED + "Das Material '" + materialName + "' wurde nicht gefunden!");
                return true;
            }

            double price;
            int amount;
            
            try {
                price = Double.parseDouble(priceStr);
                amount = Integer.parseInt(amountStr);
            } catch (NumberFormatException e) {
                sender.sendMessage(ChatColor.RED + "Ungültige Preis oder Bestandszahl! Beispiel: /shop add Diamond 20 64");
                return true;
            }

            if (amount <= 0 || price < 0) {
                sender.sendMessage(ChatColor.RED + "Menge und Preis müssen positiv sein.");
                return true;
            }

            // 1. Prüfen: Hat der Spieler die Items?
            int hasAmount = countItems(player.getInventory(), mat);
            
            if (hasAmount < amount) {
                sender.sendMessage(ChatColor.RED + "Du hast nicht genug Items! (Benötigt: " + amount + ", Vorhanden: " + hasAmount + ")");
                return true;
            }

            // 2. Items aus Inventar entfernen
            player.getInventory().removeItem(new ItemStack(mat, amount));
            player.updateInventory(); // Wichtig für Client-Update

            // 3. Spieler Geld geben (Verkauf an Server)
            double totalCost = price * amount;
            EconomyResponse response = economy.depositPlayer(player, totalCost);

            if (response.transactionSuccess()) {
                sender.sendMessage(ChatColor.GREEN + "Du hast " + amount + " " + mat.name() + " für " + totalCost + " Coins an den Server verkauft!");
                
                // 4. Shop-Config aktualisieren (Lagerbestand erhöhen)
                String itemKey = mat.name().toLowerCase();
                shopManager.addOrUpdateItem(itemKey, price, shopManager.getStock(itemKey) + amount);
            } else {
                sender.sendMessage(ChatColor.RED + "Fehler bei der Auszahlung!");
                return true;
            }

            return true;
        } 
        
        // Fallback für falsche Argumente
        if (args.length > 0 && args[0].equalsIgnoreCase("add")) {
             sender.sendMessage(ChatColor.RED + "Falsche Benutzung!");
             sender.sendMessage(ChatColor.GRAY + "Mit Item in Hand: /shop add <Preis> <Bestand>");
             sender.sendMessage(ChatColor.GRAY + "Mit Namen:      /shop add <Material> <Preis> <Bestand>");
             return true;
        }

        sender.sendMessage(ChatColor.RED + "Unbekannter Befehl! Benutze /shop [add|gui]");
        return true;
    }

    /**
     * Zählt die Anzahl der Items eines bestimmten Materials im Inventar.
     * Nutzt StorageContents, um auch Rüstung/Shulker-Slots zu prüfen.
     */
    private int countItems(PlayerInventory inv, Material mat) {
        int count = 0;
        for (ItemStack item : inv.getStorageContents()) {
            if (item != null && item.getType().equals(mat)) {
                count += item.getAmount();
            }
        }
        return count;
    }
}