package net.viper.status;

import net.md_5.bungee.api.plugin.Plugin;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UpdateChecker {

    private final Plugin plugin;
    private final String currentVersion;
    private final int intervalHours;

    // Neue Domain und korrekter API-Pfad f\u00fcr Releases
    private final String apiUrl = "https://git.viper.ipv64.net/api/v1/repos/M_Viper/StatusAPI/releases";

    private volatile String  latestVersion   = "";
    private volatile String  latestUrl       = "";
    private volatile boolean latestPreRelease = false;

    private static final Pattern TAG_NAME_PATTERN    = Pattern.compile("\"tag_name\"\\s*:\\s*\"([^\"]+)\"",   Pattern.CASE_INSENSITIVE);
    private static final Pattern HTML_URL_PATTERN    = Pattern.compile("\"html_url\"\\s*:\\s*\"([^\"]+)\"",   Pattern.CASE_INSENSITIVE);
    private static final Pattern PRERELEASE_PATTERN  = Pattern.compile("\"prerelease\"\\s*:\\s*(true|false)", Pattern.CASE_INSENSITIVE);

    public UpdateChecker(Plugin plugin, String currentVersion, int intervalHours) {
        this.plugin = plugin;
        this.currentVersion = currentVersion != null ? currentVersion : "0.0.0";
        this.intervalHours = Math.max(1, intervalHours);
    }

    public void checkNow() {
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(apiUrl).openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("User-Agent", "StatusAPI-UpdateChecker/2.0");
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);

            int code = conn.getResponseCode();
            if (code != 200) {
                plugin.getLogger().warning("Gitea/Forgejo API nicht erreichbar (HTTP " + code + ")");
                return;
            }

            StringBuilder sb = new StringBuilder();
            try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"))) {
                String line;
                while ((line = br.readLine()) != null) sb.append(line).append("\n");
            }

            String body = sb.toString();

            // Neu: Da die API ein JSON-Array von Releases zur\u00fcckgibt, nehmen wir das erste (neueste) Release
            // Wir suchen den ersten Block mit tag_name
            String foundVersion = null;
            Matcher tagM = TAG_NAME_PATTERN.matcher(body);
            if (tagM.find()) {
                foundVersion = tagM.group(1).trim();
            }

            if (foundVersion == null) {
                plugin.getLogger().warning("Keine Version (Tag) im Release gefunden.");
                return;
            }
            if (foundVersion.startsWith("v") || foundVersion.startsWith("V")) {
                foundVersion = foundVersion.substring(1);
            }

            // Release-Seiten-URL fuer die Ingame-Meldung
            String foundUrl = "https://git.viper.ipv64.net/M_Viper/StatusAPI/releases";
            Matcher urlM = HTML_URL_PATTERN.matcher(body);
            if (urlM.find()) {
                foundUrl = urlM.group(1).trim();
            }

            // prerelease-Flag aus dem ersten Release-Block lesen
            boolean foundPreRelease = false;
            Matcher preM = PRERELEASE_PATTERN.matcher(body);
            if (preM.find()) {
                foundPreRelease = Boolean.parseBoolean(preM.group(1).trim());
            }

            latestVersion    = foundVersion;
            latestUrl        = foundUrl;
            latestPreRelease = foundPreRelease;

        } catch (Exception e) {
            plugin.getLogger().log(Level.SEVERE, "Fehler beim Update-Check: " + e.getMessage(), e);
        }
    }

    public String getLatestVersion() {
        return latestVersion != null ? latestVersion : "";
    }

    public String getLatestUrl() {
        return latestUrl != null ? latestUrl : "";
    }

    public boolean isLatestPreRelease() {
        return latestPreRelease;
    }

    public boolean isUpdateAvailable(String currentVer) {
        String lv = getLatestVersion();
        if (lv.isEmpty()) return false;
        // Nur melden wenn latest STRIKT groesser als current ist.
        // Laeuft eine Dev-Version (current > latest), kein Hinweis.
        return compareVersions(lv, currentVer) > 0;
    }

    private int compareVersions(String a, String b) {
        try {
            String[] aa = a.split("\\.");
            String[] bb = b.split("\\.");
            int len = Math.max(aa.length, bb.length);
            for (int i = 0; i < len; i++) {
                int ai = i < aa.length ? Integer.parseInt(aa[i].replaceAll("\\D", "")) : 0;
                int bi = i < bb.length ? Integer.parseInt(bb[i].replaceAll("\\D", "")) : 0;
                if (ai != bi) return Integer.compare(ai, bi);
            }
            return 0;
        } catch (Exception ex) {
            return a.compareTo(b);
        }
    }
}