# -*- coding: utf-8 -*-
"""
Gleicht die tatsaechlichen Bans auf den 3 Wreckfest-Servern mit
unban_registry.json ab und entbannt jeden Eintrag, der dort als
"aktuell entbannt" gefuehrt wird - pro Server einzeln, nicht blind an
alle drei.

WARUM DAS SICHER IST: unban_registry.json wird von index.php's eigener
clearUnbanMark()-Funktion bereinigt, sobald jemand ueber die SMT-Ban-
Funktion erneut legitim gebannt wird. Wer seither zu Recht neu gebannt
wurde, taucht hier also gar nicht mehr auf.

Quelle der Wahrheit: /var/www/smt/SMT_dependency/unban_registry.json
(NICHT die alte, statische Steam-ID-Liste - die koennte veraltete
Eintraege enthalten, die zwischenzeitlich zu Recht neu gebannt wurden).

START (auf VPS2):
    python3 reconcile_unbans.py
"""

import json
import os
import time

import requests

# --- KONFIGURATION ---
PANEL_URL = "https://ipn-server.tech"
ENV_FILE = "/var/www/smt/.env"
REGISTRY_FILE = "/var/www/smt/SMT_dependency/unban_registry.json"

# Nur die drei aktuellen, echten Server-IDs verarbeiten - alte
# verwaiste Eintraege (z.B. aus frueheren Panel-Generationen) werden
# uebersprungen, da es den jeweiligen Server nicht mehr gibt.
SERVER_IDS = ["d54b7791", "6a131ded", "eba78aaa"]

SLEEP_BETWEEN_CALLS = 0.5  # Sekunden - konservativ trotz des auf 500/min erhoehten Limits


def load_api_token():
    if not os.path.exists(ENV_FILE):
        raise SystemExit(f"FEHLER: {ENV_FILE} nicht gefunden.")
    with open(ENV_FILE, "r") as f:
        for line in f:
            line = line.strip()
            if line.startswith("API_BEARER_TOKEN="):
                return line.split("=", 1)[1].strip()
    raise SystemExit(f"FEHLER: API_BEARER_TOKEN nicht in {ENV_FILE} gefunden.")


def send_command(session, server_id, command):
    url = f"{PANEL_URL}/api/client/servers/{server_id}/command"
    try:
        r = session.post(url, json={"command": command}, timeout=10)
        if r.status_code == 204:
            print(f"  [{server_id}] OK: {command}")
            return True
        else:
            print(f"  [{server_id}] Fehler {r.status_code}: {r.text[:200]}")
            return False
    except requests.RequestException as e:
        print(f"  [{server_id}] Verbindungsproblem: {e}")
        return False


def main():
    api_token = load_api_token()

    if not os.path.exists(REGISTRY_FILE):
        raise SystemExit(f"FEHLER: {REGISTRY_FILE} nicht gefunden.")
    with open(REGISTRY_FILE, "r") as f:
        registry = json.load(f)

    session = requests.Session()
    session.headers.update({
        "Authorization": f"Bearer {api_token}",
        "Content-Type": "application/json",
        "Accept": "application/json",
    })

    # Ueberspringe unbekannte/verwaiste Server-IDs, informiere aber darueber.
    skipped = [sid for sid in registry.keys() if sid not in SERVER_IDS]
    if skipped:
        print(f"Ignoriere verwaiste Server-IDs (existieren nicht mehr): {skipped}\n")

    jobs = []
    for server_id in SERVER_IDS:
        for steam_id in registry.get(server_id, {}).keys():
            jobs.append((server_id, steam_id))

    total = len(jobs)
    print(f"Starte Abgleich: {total} (Server, SteamID)-Paare aus der Registry.\n")

    ok_count = 0
    for idx, (server_id, steam_id) in enumerate(jobs, 1):
        print(f"[{idx}/{total}] SteamID {steam_id} auf Server {server_id}")
        if send_command(session, server_id, f"unban {steam_id}"):
            ok_count += 1
        if idx < total:
            time.sleep(SLEEP_BETWEEN_CALLS)

    print(f"\nFertig: {ok_count}/{total} Befehle erfolgreich gesendet.")


if __name__ == "__main__":
    main()
