"""MCP.so-Helper — HTML-Scrape der Server-Liste.

mcp.so ist eine Next.js-Site ohne öffentliche JSON-API. Wir scrapen Featured-
Server-Links aus der Startseite. Partial-Overlap mit `github.py` (topic:mcp-server)
— Aria-Synthese soll Dupes filtern.
"""
from __future__ import annotations

import datetime as dt
import html
import logging
import re
import urllib.request

log = logging.getLogger(__name__)

MCP_SO_URL = "https://mcp.so"
USER_AGENT = "aria-radar/0.1 (+aseckzai@gmail.com)"
TIMEOUT_SECONDS = 15

SERVER_LINK_RE = re.compile(r'<a[^>]*href="(/server/(?P<slug>[^/"]+)/(?P<owner>[^"]+))"', re.IGNORECASE)


def fetch(*, since: dt.datetime, max_items: int = 25) -> list[dict]:
    """Scrape mcp.so for featured/recent MCP servers."""
    req = urllib.request.Request(MCP_SO_URL, headers={"User-Agent": USER_AGENT, "Accept": "text/html"})
    try:
        with urllib.request.urlopen(req, timeout=TIMEOUT_SECONDS) as resp:
            body = resp.read().decode("utf-8", errors="replace")
    except Exception as exc:  # noqa: BLE001
        log.warning("mcp_so fetch failed: %s", exc)
        return []

    now_iso = dt.datetime.now(dt.timezone.utc).isoformat()
    items: list[dict] = []
    seen: set[str] = set()
    for m in SERVER_LINK_RE.finditer(body):
        path = m.group(1)
        if path in seen:
            continue
        seen.add(path)
        slug = m.group("slug")
        owner = m.group("owner")
        items.append({
            "title": f"{owner}/{slug}",
            "url": f"{MCP_SO_URL}{path}",
            "date": now_iso,
            "source": "mcp_so",
            "score": None,
            "raw": {"slug": slug, "owner": owner},
        })
        if len(items) >= max_items:
            break
    if not items:
        log.warning("mcp_so: no servers parsed — HTML layout may have changed")
    log.info("mcp_so: %d items", len(items))
    return items


if __name__ == "__main__":
    import json
    logging.basicConfig(level=logging.INFO)
    items = fetch(since=dt.datetime.now(dt.timezone.utc) - dt.timedelta(hours=24))
    print(json.dumps(items, indent=2))
