"""Anthropic-Docs-Helper — Release-Notes-Scraper.

Holt zwei Quellen:
- claude-code CHANGELOG.md (raw GitHub) — Versions-Header `## X.Y.Z` ohne Datum,
  letzte N Versionen werden als „heute neu" interpretiert (Dedupe filtert spätere Runs)
- API release notes (platform.claude.com) — Datums-Header `<Month> <day>, <year>`
"""
from __future__ import annotations

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

log = logging.getLogger(__name__)

USER_AGENT = "aria-radar/0.1 (+aseckzai@gmail.com)"
TIMEOUT_SECONDS = 20

CHANGELOG_RAW_URL = "https://raw.githubusercontent.com/anthropics/claude-code/main/CHANGELOG.md"
API_RELEASE_NOTES_URL = "https://platform.claude.com/docs/en/release-notes/overview"

VERSION_HEADER_RE = re.compile(r"^##\s+(?P<ver>v?\d+\.\d+\.\d+)\s*$", re.MULTILINE)
DATE_HEADER_RE = re.compile(
    r"(?P<date>(?:January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{1,2},\s+\d{4})"
)


def _http_get(url: str) -> str:
    req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT, "Accept": "text/plain, text/html"})
    with urllib.request.urlopen(req, timeout=TIMEOUT_SECONDS) as resp:
        return resp.read().decode("utf-8", errors="replace")


def _fetch_claude_code_changelog(max_entries: int) -> list[dict]:
    try:
        body = _http_get(CHANGELOG_RAW_URL)
    except Exception as exc:  # noqa: BLE001
        log.warning("anthropic_docs claude-code CHANGELOG fetch failed: %s", exc)
        return []

    versions = VERSION_HEADER_RE.findall(body)[:max_entries]
    today = dt.datetime.now(dt.timezone.utc).date().isoformat()
    items: list[dict] = []
    for ver in versions:
        items.append({
            "title": f"claude-code {ver}",
            "url": f"https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#{ver.replace('.', '')}",
            "date": today,
            "source": "anthropic_docs",
            "score": None,
            "raw": {"channel": "claude-code", "version": ver},
        })
    return items


def _fetch_api_release_notes(since: dt.datetime, max_entries: int) -> list[dict]:
    try:
        body = _http_get(API_RELEASE_NOTES_URL)
    except Exception as exc:  # noqa: BLE001
        log.warning("anthropic_docs API release notes fetch failed: %s", exc)
        return []

    seen_dates: set[str] = set()
    items: list[dict] = []
    for m in DATE_HEADER_RE.finditer(body):
        raw_date = m.group("date")
        if raw_date in seen_dates:
            continue
        seen_dates.add(raw_date)
        try:
            parsed = dt.datetime.strptime(raw_date, "%B %d, %Y").replace(tzinfo=dt.timezone.utc)
        except ValueError:
            continue
        if parsed < since:
            continue
        items.append({
            "title": f"Anthropic API release {parsed.date().isoformat()}",
            "url": f"{API_RELEASE_NOTES_URL}#{parsed.date().isoformat()}",
            "date": parsed.isoformat(),
            "source": "anthropic_docs",
            "score": None,
            "raw": {"channel": "api", "raw_date": raw_date},
        })
        if len(items) >= max_entries:
            break
    return items


def fetch(*, since: dt.datetime, max_items: int = 10) -> list[dict]:
    """Fetch latest Anthropic release notes (claude-code + API)."""
    items: list[dict] = []
    items.extend(_fetch_claude_code_changelog(max_entries=5))
    items.extend(_fetch_api_release_notes(since=since, max_entries=max_items - len(items)))
    log.info("anthropic_docs: %d items", len(items))
    return items


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