package net.viper.status.modules.AutoMessage;

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.TextComponent;
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.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * AutoMessageModule
 *
 * Fix #5:
 *   - Nachrichten werden bei jedem Zyklus frisch aus der Datei gelesen,
 *     damit \u00c4nderungen an messages.txt sofort wirken ohne Neustart.
 *   - Neuer Befehl /automessage reload (Permission: statusapi.automessage)
 *     l\u00e4dt die Konfiguration neu und setzt den Z\u00e4hler zur\u00fcck.
 *   - TextComponent.fromLegacy() → ChatColor.translateAlternateColorCodes f\u00fcr §-Codes.
 */
public class AutoMessageModule implements Module {

    private int taskId = -1;
    private StatusAPI api;
    private final AtomicInteger currentIndex = new AtomicInteger(0);

    // Konfiguration (f\u00fcr Reload zug\u00e4nglich)
    private volatile boolean enabled = false;
    private volatile int intervalSeconds = 300;
    private volatile String fileName = "messages.txt";
    private volatile String prefix = "";

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

    @Override
    public void onEnable(Plugin plugin) {
        this.api = (StatusAPI) plugin;
        loadSettings();
        ensureMessagesFileExists();

        if (!enabled) return;

        registerReloadCommand();
        scheduleTask();
    }

    @Override
    public void onDisable(Plugin plugin) {
        cancelTask();
    }

    private void ensureMessagesFileExists() {
        File dataFolder = api.getDataFolder();
        if (!dataFolder.exists()) dataFolder.mkdirs();

        File target = new File(dataFolder, fileName);
        if (target.exists()) return;

        // Datei aus den Plugin-Ressourcen kopieren
        try (java.io.InputStream in = api.getResourceAsStream(fileName)) {
            if (in != null) {
                Files.copy(in, target.toPath());
                api.getLogger().info("[AutoMessage] " + fileName + " wurde aus den Ressourcen erstellt.");
                return;
            }
        } catch (IOException e) {
            api.getLogger().warning("[AutoMessage] Konnte " + fileName + " nicht aus Ressourcen kopieren: " + e.getMessage());
        }

        // Fallback: leere Datei mit Hinweis anlegen
        try {
            Files.write(target.toPath(),
                ("# AutoMessage – eine Nachricht pro Zeile\n" +
                 "# Farben mit & oder §-Codes, z.B. &aGr\u00fcner Text\n" +
                 "# Kommentarzeilen (# ...) und Leerzeilen werden ignoriert\n").getBytes(StandardCharsets.UTF_8));
            api.getLogger().info("[AutoMessage] " + fileName + " wurde als leere Vorlage erstellt.");
        } catch (IOException e) {
            api.getLogger().severe("[AutoMessage] Konnte " + fileName + " nicht erstellen: " + e.getMessage());
        }
    }

    private void loadSettings() {
        Properties props = api.getVerifyProperties();
        enabled         = Boolean.parseBoolean(props.getProperty("automessage.enabled", "false"));
        String rawInterval = props.getProperty("automessage.interval", "300");
        try { intervalSeconds = Integer.parseInt(rawInterval); }
        catch (NumberFormatException e) { api.getLogger().warning("Ung\u00fcltiges Intervall f\u00fcr AutoMessage! Nutze Standard (300s)."); intervalSeconds = 300; }
        fileName = props.getProperty("automessage.file", "messages.txt");
        prefix   = props.getProperty("automessage.prefix", "");
    }

    private void registerReloadCommand() {
        ProxyServer.getInstance().getPluginManager().registerCommand(api, new Command("automessage", "statusapi.automessage") {
            @Override
            public void execute(CommandSender sender, String[] args) {
                if (args.length > 0 && "reload".equalsIgnoreCase(args[0])) {
                    cancelTask();
                    loadSettings();
                    currentIndex.set(0);
                    if (enabled) {
                        scheduleTask();
                        sender.sendMessage(ChatColor.GREEN + "[AutoMessage] Neu geladen. Intervall: " + intervalSeconds + "s");
                    } else {
                        sender.sendMessage(ChatColor.YELLOW + "[AutoMessage] Modul ist deaktiviert (automessage.enabled=false).");
                    }
                } else {
                    sender.sendMessage(ChatColor.YELLOW + "/automessage reload");
                }
            }
        });
    }

    private void scheduleTask() {
        taskId = ProxyServer.getInstance().getScheduler().schedule(api, () -> {
            File messageFile = new File(api.getDataFolder(), fileName);
            if (!messageFile.exists()) {
                api.getLogger().warning("[AutoMessage] Datei nicht gefunden: " + messageFile.getAbsolutePath());
                return;
            }

            // Fix #5: Datei bei jedem Tick neu einlesen → \u00c4nderungen wirken sofort
            List<String> messages;
            try {
                messages = Files.readAllLines(messageFile.toPath(), StandardCharsets.UTF_8);
            } catch (IOException e) {
                api.getLogger().severe("[AutoMessage] Fehler beim Lesen von '" + fileName + "': " + e.getMessage());
                return;
            }
            messages.removeIf(line -> line.trim().isEmpty() || line.trim().startsWith("#"));
            if (messages.isEmpty()) return;

            // Index wrappen (threadsafe)
            int idx = currentIndex.getAndUpdate(i -> (i + 1) % messages.size());
            if (idx >= messages.size()) idx = 0;

            String raw = messages.get(idx);
            String prefixPart = prefix.isEmpty() ? "" : ChatColor.translateAlternateColorCodes('&', prefix) + " ";
            // Fix: §-Codes direkt \u00fcbersetzen (messages.txt nutzt §-Codes)
            String text = prefixPart + ChatColor.translateAlternateColorCodes('&',
                    raw.replace("\u00a7", "&").replace("§", "&"));

            ProxyServer.getInstance().broadcast(new TextComponent(text));
        }, intervalSeconds, intervalSeconds, TimeUnit.SECONDS).getId();
    }

    private void cancelTask() {
        if (taskId != -1) {
            ProxyServer.getInstance().getScheduler().cancel(taskId);
            taskId = -1;
        }
    }
}
