package net.viper.status.modules.help;

import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.Plugin;
import net.viper.status.StatusAPI;
import net.viper.status.module.Module;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * HelpModule – seitenbasierte Ingame-Hilfe.
 *
 * verify.properties:
 *   statusapi.help=vn                      →  /vn help [seite]
 *   statusapi.help.permission=statusapi.admin
 */
public class HelpModule implements Module {

    private String commandName    = "help";
    private String adminPermission = "statusapi.admin";

    @Override
    public String getName() { return "HelpModule"; }

    @Override
    public void onEnable(Plugin plugin) {
        Properties props = ((StatusAPI) plugin).getVerifyProperties();
        if (props != null) {
            String cn = props.getProperty("statusapi.help", "help").trim();
            if (!cn.isEmpty()) commandName = cn;
            String ap = props.getProperty("statusapi.help.permission", "statusapi.admin").trim();
            if (!ap.isEmpty()) adminPermission = ap;
        }
        ProxyServer.getInstance().getPluginManager().registerCommand(plugin,
                new HelpCommand(commandName, adminPermission));
        plugin.getLogger().info("[HelpModule] /" + commandName + " help registriert (Admin-Permission: " + adminPermission + ")");
    }

    @Override
    public void onDisable(Plugin plugin) {}

    // ─────────────────────────────────────────────────────────────────────────

    private static class HelpCommand extends Command {

        private final String adminPerm;

        // Jede Seite ist eine Liste von Zeilen
        // Seiten werden zur Laufzeit je nach Berechtigung zusammengebaut
        HelpCommand(String name, String adminPerm) {
            super(name, null);
            this.adminPerm = adminPerm;
        }

        @Override
        public void execute(CommandSender sender, String[] args) {
            if (args.length == 0) {
                send(sender, "&7Nutze &e/" + getName() + " help &7f\u00fcr eine Befehls\u00fcbersicht.");
                return;
            }
            if (!args[0].equalsIgnoreCase("help")) {
                send(sender, "&cUnbekannter Unterbefehl. Nutze &e/" + getName() + " help&c.");
                return;
            }

            boolean isAdmin = !(sender instanceof ProxiedPlayer)
                    || sender.hasPermission(adminPerm)
                    || sender.hasPermission("statusapi.admin");

            // Seiten aufbauen
            List<List<String>> pages = buildPages(isAdmin);

            int totalPages = pages.size();
            int page = 1;

            if (args.length >= 2) {
                try {
                    page = Integer.parseInt(args[1].trim());
                } catch (NumberFormatException e) {
                    send(sender, "&cUng\u00fcltige Seitenzahl. Nutze &e/" + getName() + " help <1-" + totalPages + ">&c.");
                    return;
                }
            }

            if (page < 1 || page > totalPages) {
                send(sender, "&cSeite &e" + page + " &cexistiert nicht. Verf\u00fcgbar: &e1&c-&e" + totalPages + "&c.");
                return;
            }

            // Header
            send(sender, "");
            send(sender, "&8&m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
            send(sender, "  &6&lStatusAPI &8| &7Hilfe  &8– &7Seite &e" + page + "&8/&e" + totalPages);
            send(sender, "&8&m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
            send(sender, "");

            // Seiteninhalte
            for (String line : pages.get(page - 1)) {
                send(sender, line);
            }

            send(sender, "");

            // Navigation
            sendNavigation(sender, getName(), page, totalPages);
            send(sender, "");
        }

        /** Baut alle Seiten zusammen. Admins bekommen zus\u00e4tzliche Seiten. */
        private List<List<String>> buildPages(boolean isAdmin) {
            List<List<String>> pages = new ArrayList<>();

            // ── Seite 1: Allgemein & Chat ─────────────────────────────────────
            List<String> p1 = new ArrayList<>();
            p1.add("  &e&lAllgemein");
            p1.add("  &a/verify <token>              &8– &7Account verifizieren");
            p1.add("  &a/forumlink &8(&7/fl&8)            &8– &7Forum-Account verkn\u00fcpfen");
            p1.add("  &a/forum                      &8– &7Forum-Benachrichtigungen");
            p1.add("  &a/go [server] &8(&7/wechsel, /switch&8) &8– &7Serverwechsel");
            p1.add("  &a/scoreboard &8(&7/sb&8) [hide|show] &8– &7Scoreboard umschalten");
            p1.add("");
            p1.add("  &e&lChat");
            p1.add("  &a/msg <Spieler> <Text> &8(&7/w, /tell&8) &8– &7Private Nachricht");
            p1.add("  &a/r <Text> &8(&7/reply, /antwort&8)    &8– &7Auf PN antworten");
            p1.add("  &a/ignore <Spieler> &8(&7/block&8)      &8– &7Spieler ignorieren");
            p1.add("  &a/unignore <Spieler> &8(&7/unblock&8)  &8– &7Ignorierung aufheben");
            p1.add("  &a/channel [kanal] &8(&7/ch, /kanal&8)  &8– &7Kanal wechseln");
            p1.add("  &a/chataus &8(&7/togglechat&8)           &8– &7Chat-Empfang umschalten");
            pages.add(p1);

            // ── Seite 2: Chat (weiter) & Account-Verkn\u00fcpfungen ───────────────
            List<String> p2 = new ArrayList<>();
            p2.add("  &e&lChat (Fortsetzung)");
            p2.add("  &a/emoji &8(&7/emojis&8)               &8– &7Alle Emojis anzeigen");
            p2.add("  &a/mentions &8(&7/mention&8)           &8– &7Mention-Benachrichtigungen");
            p2.add("  &a/helpop <Nachricht>         &8– &7Team um Hilfe bitten");
            p2.add("  &a/report <Spieler> <Grund>  &8– &7Spieler melden");
            p2.add("  &a/chatbypass &8(&7/cbp&8)             &8– &7ChatModule \u00fcberspringen");
            p2.add("");
            p2.add("  &e&lAccount-Verkn\u00fcpfungen");
            p2.add("  &a/discordlink &8(&7/dlink&8)          &8– &7Discord verkn\u00fcpfen");
            p2.add("  &a/telegramlink &8(&7/tlink&8)         &8– &7Telegram verkn\u00fcpfen");
            p2.add("  &a/unlink <discord|telegram|all> &8– &7Verkn\u00fcpfung aufheben");
            pages.add(p2);

            // ── Admin-Seiten nur f\u00fcr Berechtigte ──────────────────────────────
            if (isAdmin) {
                // ── Seite 3: StatusAPI, AntiBot, Vanish ───────────────────────
                List<String> p3 = new ArrayList<>();
                p3.add("  &c&lAdmin &8– &eStatusAPI & AntiBot");
                p3.add("  &c/statusapi reload &8(&7/sapi reload&8) &8– &7Scoreboard & Tablist neu laden");
                p3.add("  &c/netinfo                    &8– &7Proxy- & Systeminfos");
                p3.add("");
                p3.add("  &c/antibot status             &8– &7AntiBot-Status anzeigen");
                p3.add("  &c/antibot clearblocks        &8– &7IP-Blockliste leeren");
                p3.add("  &c/antibot unblock <IP>       &8– &7IP entsperren");
                p3.add("  &c/antibot profile            &8– &7Schutzprofil wechseln");
                p3.add("  &c/antibot reload             &8– &7AntiBot neu laden");
                p3.add("");
                p3.add("  &c&lAdmin &8– &eVanish");
                p3.add("  &c/vanish [Spieler] &8(&7/v&8)     &8– &7Unsichtbar schalten");
                p3.add("  &c/vanishlist &8(&7/vlist&8)        &8– &7Unsichtbare Spieler anzeigen");
                pages.add(p3);

                // ── Seite 4: Chat-Admin, Reports, sonstige ────────────────────
                List<String> p4 = new ArrayList<>();
                p4.add("  &c&lAdmin &8– &eChat-Administration");
                p4.add("  &c/broadcast <Text> &8(&7/bc, /alert&8) &8– &7Broadcast an alle");
                p4.add("  &c/chatmute <Spieler> [Min.] &8(&7/gmute&8) &8– &7Spieler muten");
                p4.add("  &c/chatunmute <Spieler> &8(&7/gunmute&8)   &8– &7Mute aufheben");
                p4.add("  &c/socialspy &8(&7/spy&8)           &8– &7Private Nachrichten mitlesen");
                p4.add("  &c/chatinfo <Spieler>        &8– &7Chat-Info eines Spielers");
                p4.add("  &c/chathist [Spieler] [n]    &8– &7Chat-Verlauf anzeigen");
                p4.add("  &c/chatreload                &8– &7Chat-Konfiguration neu laden");
                p4.add("");
                p4.add("  &c&lAdmin &8– &eReports, Tools");
                p4.add("  &c/reports [all]             &8– &7Offene Reports anzeigen");
                p4.add("  &c/reportclose <ID>          &8– &7Report schlie\u00dfen");
                p4.add("  &c/automessage reload        &8– &7AutoMessage neu laden");
                p4.add("  &c/bcmds reload              &8– &7Custom-Commands neu laden");
                p4.add("  &c/cb <Befehl>               &8– &7Command-Blocker verwalten");
                p4.add("  &c/scoreboard admin|player   &8– &7Admin/Spieler-Ansicht wechseln");
                pages.add(p4);
            }

            return pages;
        }

        /** Sendet eine klickbare Navigationszeile mit ◀ Seite X/Y ▶ */
        private void sendNavigation(CommandSender sender, String cmd, int page, int total) {
            // F\u00fcr Konsole: einfacher Text
            if (!(sender instanceof ProxiedPlayer)) {
                String nav = "  ";
                if (page > 1)     nav += "&7[&e◀&7] ";
                nav += "&8Seite &e" + page + "&8/&e" + total;
                if (page < total) nav += " &7[&e▶&7]";
                send(sender, nav);
                return;
            }

            // F\u00fcr Spieler: klickbare Buttons
            TextComponent line = new TextComponent("  ");

            // ◀ zur\u00fcck
            if (page > 1) {
                TextComponent prev = new TextComponent(
                        ChatColor.translateAlternateColorCodes('&', "&7[&e◀&7] "));
                prev.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
                        "/" + cmd + " help " + (page - 1)));
                prev.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
                        new ComponentBuilder(ChatColor.translateAlternateColorCodes('&',
                                "&7Seite &e" + (page - 1) + " &7anzeigen")).create()));
                line.addExtra(prev);
            }

            // Seitenanzeige
            TextComponent mid = new TextComponent(
                    ChatColor.translateAlternateColorCodes('&',
                            "&8Seite &e" + page + "&8/&e" + total));
            line.addExtra(mid);

            // ▶ vor
            if (page < total) {
                TextComponent next = new TextComponent(
                        ChatColor.translateAlternateColorCodes('&', " &7[&e▶&7]"));
                next.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
                        "/" + cmd + " help " + (page + 1)));
                next.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
                        new ComponentBuilder(ChatColor.translateAlternateColorCodes('&',
                                "&7Seite &e" + (page + 1) + " &7anzeigen")).create()));
                line.addExtra(next);
            }

            sender.sendMessage(line);
        }

        private static void send(CommandSender s, String text) {
            s.sendMessage(new TextComponent(
                    ChatColor.translateAlternateColorCodes('&', text)));
        }
    }
}
