package de.viper.survivalplus.Manager;

import de.viper.survivalplus.SurvivalPlus;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class CommandBlocker implements Listener, CommandExecutor {

    private final SurvivalPlus plugin;
    private FileConfiguration blockedCommandsConfig;
    private File blockedCommandsFile;
    private List<String> blockedCommands;

    public CommandBlocker(SurvivalPlus plugin) {
        this.plugin = plugin;

        // Lade blockedcommands.yml
        try {
            blockedCommandsFile = new File(plugin.getDataFolder(), "blockedcommands.yml");
            if (!blockedCommandsFile.exists()) {
                plugin.saveResource("blockedcommands.yml", false);
            }
            blockedCommandsConfig = YamlConfiguration.loadConfiguration(blockedCommandsFile);
            blockedCommands = blockedCommandsConfig.getStringList("blocked-commands");
            if (blockedCommands == null) {
                blockedCommands = new ArrayList<>();
            }
        } catch (Exception ignored) {
            blockedCommands = new ArrayList<>();
        }

        // Registriere Listener und Command
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
        plugin.getCommand("sp").setExecutor(this);
    }

    /**
     * Verarbeitet /sp cb Befehle
     */
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (args.length < 2 || !args[0].equalsIgnoreCase("cb")) {
            return false; // Wird von anderen /sp Subcommands behandelt
        }

        String subCommand = args[1].toLowerCase();

        switch (subCommand) {
            case "add":
                return handleAddCommand(sender, args);
            case "remove":
                return handleRemoveCommand(sender, args);
            case "list":
                return handleListCommand(sender);
            default:
                sender.sendMessage("§cUnbekannter Subcommand! Verfügbare Subcommands: add, remove, list");
                return true;
        }
    }

    /**
     * /sp cb add <command>
     */
    private boolean handleAddCommand(CommandSender sender, String[] args) {
        if (!sender.hasPermission("survivalplus.commandblocker.add")) {
            sender.sendMessage("§cDu hast keine Berechtigung für diesen Befehl!");
            return true;
        }

        if (args.length < 3) {
            sender.sendMessage("§eBenutzung: /sp cb add <command>");
            return true;
        }

        String commandToBlock = args[2].toLowerCase().replaceFirst("^/", "").trim();
        if (commandToBlock.isEmpty()) {
            sender.sendMessage("§cBitte gib einen gültigen Befehl an!");
            return true;
        }

        try {
            if (blockedCommands.contains(commandToBlock)) {
                sender.sendMessage("§cDer Befehl §e/" + commandToBlock + "§c ist bereits blockiert!");
                return true;
            }

            blockedCommands.add(commandToBlock);
            blockedCommandsConfig.set("blocked-commands", blockedCommands);
            blockedCommandsConfig.save(blockedCommandsFile);
            sender.sendMessage("§aDer Befehl §e/" + commandToBlock + "§a wurde zur Blockierliste hinzugefügt.");
        } catch (Exception ignored) {
            sender.sendMessage("§cFehler beim Hinzufügen des Befehls!");
        }
        return true;
    }

    /**
     * /sp cb remove <command>
     */
    private boolean handleRemoveCommand(CommandSender sender, String[] args) {
        if (!sender.hasPermission("survivalplus.commandblocker.remove")) {
            sender.sendMessage("§cDu hast keine Berechtigung für diesen Befehl!");
            return true;
        }

        if (args.length < 3) {
            sender.sendMessage("§eBenutzung: /sp cb remove <command>");
            return true;
        }

        String commandToUnblock = args[2].toLowerCase().replaceFirst("^/", "").trim();
        if (commandToUnblock.isEmpty()) {
            sender.sendMessage("§cBitte gib einen gültigen Befehl an!");
            return true;
        }

        try {
            if (!blockedCommands.contains(commandToUnblock)) {
                sender.sendMessage("§cDer Befehl §e/" + commandToUnblock + "§c ist nicht blockiert!");
                return true;
            }

            blockedCommands.remove(commandToUnblock);
            blockedCommandsConfig.set("blocked-commands", blockedCommands);
            blockedCommandsConfig.save(blockedCommandsFile);
            sender.sendMessage("§aDer Befehl §e/" + commandToUnblock + "§a wurde aus der Blockierliste entfernt.");
        } catch (Exception ignored) {
            sender.sendMessage("§cFehler beim Entfernen des Befehls!");
        }
        return true;
    }

    /**
     * /sp cb list
     */
    private boolean handleListCommand(CommandSender sender) {
        if (!sender.hasPermission("survivalplus.commandblocker.list")) {
            sender.sendMessage("§cDu hast keine Berechtigung für diesen Befehl!");
            return true;
        }

        try {
            if (blockedCommands.isEmpty()) {
                sender.sendMessage("§eEs sind keine Befehle blockiert.");
                return true;
            }

            sender.sendMessage("§6=== Blockierte Befehle ===");
            for (String cmd : blockedCommands) {
                sender.sendMessage("§e- /" + cmd);
            }
            sender.sendMessage("§6=====================");
        } catch (Exception ignored) {
            sender.sendMessage("§cFehler beim Abrufen der Blockierliste!");
        }
        return true;
    }

    /**
     * Blockiere Befehle, wenn sie in der Liste sind
     */
    @EventHandler
    public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
        Player player = event.getPlayer();
        if (player.hasPermission("survivalplus.commandblocker.bypass")) {
            return; // Spieler mit Bypass-Berechtigung ignorieren
        }

        try {
            String command = event.getMessage().toLowerCase().replaceFirst("^/", "").trim();
            // Extrahiere den Hauptbefehl (ohne Argumente)
            String mainCommand = command.split("\\s+")[0];

            if (blockedCommands.contains(mainCommand)) {
                event.setCancelled(true);
                player.sendMessage("§cDieser Befehl ist blockiert!");
            }
        } catch (Exception ignored) {
            // Keine Konsolenausgabe
        }
    }
}