package de.viper.survivalplus.commands;

import de.viper.survivalplus.SurvivalPlus;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NickCommand implements CommandExecutor {

    private static final Pattern HEX_PATTERN = Pattern.compile("#[a-fA-F0-9]{6}");
    private final SurvivalPlus plugin;

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

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

        if (!player.hasPermission("survivalplus.nick")) {
            player.sendMessage("§cDu hast keine Berechtigung für diesen Befehl!");
            return true;
        }

        if (args.length == 0) {
            player.sendMessage("§eBenutzung: /nick <Name>");
            player.sendMessage("§eVerwende /nick off um den Nickname zu entfernen.");
            return true;
        }

        // Entfernen des Nicks
        if (args.length == 1 && (args[0].equalsIgnoreCase("off") || args[0].equalsIgnoreCase("remove") || args[0].equalsIgnoreCase("reset"))) {
            String uuid = player.getUniqueId().toString();

            plugin.getNicknamesConfig().set(uuid, null);
            plugin.saveNicknamesConfig();

            // WICHTIG: Nur DisplayName setzen, TablistManager übernimmt den Rest
            player.setDisplayName(player.getName());

            player.sendMessage("§aDein Nickname wurde entfernt.");
            return true;
        }

        // Zusammenbauen des Nicknames
        StringBuilder sb = new StringBuilder();
        for (String arg : args) {
            sb.append(arg).append(" ");
        }
        String rawNick = sb.toString().trim();

        // Verbotene Nicks prüfen
        List<String> forbidden = plugin.getConfig().getStringList("forbidden-nicks");
        for (String word : forbidden) {
            if (rawNick.toLowerCase().contains(word.toLowerCase())) {
                player.sendMessage("§cDieser Nickname ist nicht erlaubt!");
                return true;
            }
        }

        // Farben anwenden
        String coloredNick = translateColors(rawNick);

        // Chat/Display: [Nick]
        String finalNickForDisplay = "§f[" + coloredNick + "§f]";

        // WICHTIG: Nur DisplayName setzen
        // playerListName wird vom TablistManager automatisch gesetzt
        player.setDisplayName(finalNickForDisplay);

        // Speichern (ungefärbten Namen)
        plugin.getNicknamesConfig().set(player.getUniqueId().toString(), rawNick);
        plugin.saveNicknamesConfig();

        player.sendMessage("§aDein Nickname wurde zu " + finalNickForDisplay + " geändert.");
        return true;
    }

    private String translateColors(String input) {
        String withLegacy = org.bukkit.ChatColor.translateAlternateColorCodes('&', input);
        Matcher matcher = HEX_PATTERN.matcher(withLegacy);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String hexCode = matcher.group();
            String replacement = ChatColor.of(hexCode).toString();
            matcher.appendReplacement(sb, replacement);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}