package de.viper.survivalplus.commands;

import de.viper.survivalplus.SurvivalPlus;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.configuration.file.FileConfiguration;
import java.io.File;
import java.util.UUID;
import java.util.logging.Level;

public class EnderchestCommand implements CommandExecutor {
    private final SurvivalPlus plugin;

    public EnderchestCommand(SurvivalPlus plugin) {
        this.plugin = plugin;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage(plugin.getLangConfig().getString("player-only", "§cDieser Befehl ist nur für Spieler!"));
            return true;
        }

        Player player = (Player) sender;
        FileConfiguration lang = plugin.getLangConfig();

        if (!player.hasPermission("survivalplus.enderchest.own")) {
            player.sendMessage(lang.getString("no-permission", "§cDu hast keine Berechtigung für diesen Befehl!"));
            return true;
        }

        OfflinePlayer target;
        String targetName;

        if (args.length == 0) {
            // Öffne die eigene Enderchest
            target = player;
            targetName = player.getName();
        } else if (args.length == 1) {
            // Öffne die Enderchest eines anderen Spielers
            if (!player.hasPermission("survivalplus.enderchest.others")) {
                player.sendMessage(lang.getString("no-permission-others-ec", "§cDu hast keine Berechtigung, die Enderchest anderer Spieler anzusehen!"));
                return true;
            }
            targetName = args[0];
            Player onlineTarget = Bukkit.getPlayerExact(targetName);
            if (onlineTarget != null) {
                target = onlineTarget;
            } else {
                target = Bukkit.getOfflinePlayer(targetName);
                if (target.getName() == null || !target.hasPlayedBefore()) {
                    player.sendMessage(lang.getString("player-not-found", "§cSpieler nicht gefunden!"));
                    return true;
                }
            }
        } else {
            player.sendMessage(lang.getString("enderchest.usage", "§cVerwendung: /ec [spieler]"));
            return true;
        }

        // Erstelle die GUI
        Inventory gui = Bukkit.createInventory(null, 27, lang.getString("enderchest.gui-title", "Enderchest von ") + targetName);

        // Lade die Enderchest
        if (target.isOnline()) {
            Player onlineTarget = target.getPlayer();
            Inventory enderChest = onlineTarget.getEnderChest();
            for (int i = 0; i < 27; i++) {
                gui.setItem(i, enderChest.getItem(i));
            }
            plugin.getLogger().log(Level.INFO, "Enderchest für " + targetName + " (online) erfolgreich geladen");
        } else {
            UUID uuid = target.getUniqueId();
            try {
                // Lade Offline-Spieler-Enderchest aus playerdata
                File dataFolder = new File(plugin.getServer().getWorlds().get(0).getWorldFolder(), "playerdata");
                File playerFile = new File(dataFolder, uuid.toString() + ".dat");

                if (!playerFile.exists()) {
                    player.sendMessage(lang.getString("enderchest.data-not-found", "§cDie Enderchest-Daten des Spielers konnten nicht gefunden werden! Der Spieler war möglicherweise nie auf diesem Server."));
                    return true;
                }

                String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
                plugin.getLogger().log(Level.INFO, "Versuche, Enderchest für " + targetName + " zu laden (UUID: " + uuid + ", Version: " + version + ")");

                // Verwende Reflection, um die Enderchest-Daten zu laden
                Class<?> nbtIoClass = Class.forName("net.minecraft.nbt.NbtIo");
                Class<?> nbtCompoundClass = Class.forName("net.minecraft.nbt.NbtCompound");
                Class<?> nbtListClass = Class.forName("net.minecraft.nbt.NbtList");
                Class<?> craftInventoryClass = Class.forName("org.bukkit.craftbukkit." + version + ".inventory.CraftInventory");

                Object nbtCompound = nbtIoClass.getMethod("readCompressed", java.nio.file.Path.class).invoke(null, playerFile.toPath());
                Object enderItemsList = nbtCompoundClass.getMethod("getList", String.class, int.class).invoke(nbtCompound, "EnderItems", 10);
                Object craftInventory = craftInventoryClass.getConstructor(nbtListClass).newInstance(enderItemsList);

                ItemStack[] items = (ItemStack[]) craftInventoryClass.getMethod("getContents").invoke(craftInventory);
                for (int i = 0; i < Math.min(items.length, 27); i++) {
                    gui.setItem(i, items[i]);
                }
                plugin.getLogger().log(Level.INFO, "Enderchest für " + targetName + " erfolgreich geladen");
            } catch (Exception e) {
                plugin.getLogger().log(Level.SEVERE, "Fehler beim Laden der Enderchest für " + targetName + " (UUID: " + uuid + ")", e);
                String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
                player.sendMessage(lang.getString("enderchest.load-error", "§cFehler beim Laden der Enderchest: %error%")
                    .replace("%error%", errorMessage));
                return true;
            }
        }

        player.openInventory(gui);
        player.sendMessage(lang.getString("enderchest.opened", "§aEnderchest von %player% geöffnet!")
            .replace("%player%", targetName));
        return true;
    }
}