#!/usr/bin/env python3
"""
Polymarket-Daten-Starter (polymarkt.de)

Liest offene Polymarket-Märkte aus der öffentlichen Gamma-API, zeigt die
Wahrscheinlichkeiten, speichert sie als CSV und meldet Märkte über einer Schwelle.
Nur Lesen, kein Handel, kein API-Key, keine Zusatzpakete (Python 3.9+).

Beispiele:
  python3 polymarket-daten-starter.py                       # Rubrik "germany"
  python3 polymarket-daten-starter.py --tag fed-rates --limit 10
  python3 polymarket-daten-starter.py --tag crypto --csv krypto.csv --alarm 80

Keine Anlage- oder Wettempfehlung. Handeln auf Polymarket ist aus Deutschland gesperrt.
Doku und Erklärung: https://www.polymarkt.de/vorlagen
"""
import argparse
import csv
import json
import sys
import urllib.request
from datetime import datetime, timezone

GAMMA = "https://gamma-api.polymarket.com/events"


def fetch_events(tag: str, limit: int) -> list:
    url = f"{GAMMA}?limit={limit}&active=true&closed=false&order=volume&ascending=false&tag_slug={tag}"
    req = urllib.request.Request(url, headers={"User-Agent": "polymarkt-daten-starter/1.0"})
    with urllib.request.urlopen(req, timeout=20) as res:
        return json.load(res)


def outcomes(event: dict) -> list:
    """Offene Teilmärkte → Liste (Ausgang, Wahrscheinlichkeit in %), absteigend."""
    rows = []
    markets = event.get("markets") or []
    for m in markets:
        # Platzhalter-Märkte (active: false) stehen ungehandelt auf 50 % und werden übersprungen
        if m.get("closed") or m.get("active") is False:
            continue
        try:
            names = json.loads(m["outcomes"])
            prices = [float(p) for p in json.loads(m["outcomePrices"])]
        except (KeyError, ValueError, TypeError):
            continue
        if len(markets) == 1 or "Yes" not in names:
            rows += [(n, p * 100) for n, p in zip(names, prices)]
        else:
            rows.append((m.get("groupItemTitle") or m.get("question", "?"), prices[names.index("Yes")] * 100))
    return sorted(rows, key=lambda r: -r[1])


def main() -> int:
    ap = argparse.ArgumentParser(description="Polymarket-Wahrscheinlichkeiten aus der Gamma-API lesen")
    ap.add_argument("--tag", default="germany", help="Rubrik, z. B. germany, fed-rates, geopolitics, crypto")
    ap.add_argument("--limit", type=int, default=5, help="Anzahl Events (nach Volumen)")
    ap.add_argument("--top", type=int, default=3, help="Ausgänge pro Event")
    ap.add_argument("--csv", help="Ergebnis zusätzlich als CSV speichern")
    ap.add_argument("--alarm", type=float, help="Ausgänge ab dieser Wahrscheinlichkeit (%%) hervorheben")
    args = ap.parse_args()

    try:
        events = fetch_events(args.tag, args.limit)
    except Exception as exc:  # Netzwerk, Rate-Limit, Timeout
        print(f"Fehler beim Abruf: {exc}", file=sys.stderr)
        return 1

    stand = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC")
    rows, alarms = [], []
    for ev in events:
        print(f"\n{ev.get('title')}  (Volumen {ev.get('volume', 0):,.0f} $)")
        for name, pct in outcomes(ev)[: args.top]:
            print(f"  {pct:5.1f} %  {name}")
            rows.append([stand, args.tag, ev.get("slug"), ev.get("title"), name, round(pct, 2), round(ev.get("volume", 0))])
            if args.alarm is not None and pct >= args.alarm:
                alarms.append(f"{ev.get('title')}: {name} {pct:.1f} %")

    if args.csv:
        with open(args.csv, "a", newline="", encoding="utf-8") as fh:
            w = csv.writer(fh)
            if fh.tell() == 0:
                w.writerow(["stand", "rubrik", "slug", "event", "ausgang", "prozent", "volumen_usd"])
            w.writerows(rows)
        print(f"\n{len(rows)} Zeilen an {args.csv} angehängt.")

    if alarms:
        print("\nÜber der Schwelle:")
        for a in alarms:
            print("  " + a)
    print(f"\nStand {stand} · Quelle: Polymarket Gamma-API · keine Wettempfehlung")
    return 0


if __name__ == "__main__":
    sys.exit(main())
