"""RSS haber toplayıcı — Türk spor kaynaklarından haber çeker.

Kaynaklar 16.08.2026'da canlı test edildi. Bozuk XML'ler lxml recover
modu ile kurtarılır; bir kaynak düşerse diğerleri çalışmaya devam eder.
"""
import hashlib
import logging
import re
from datetime import datetime, timezone
from email.utils import parsedate_to_datetime

from curl_cffi import requests
from lxml import etree

log = logging.getLogger("news.rss")

# (ad, url) — doğrulanmış çalışan kaynaklar
FEEDS = [
    ("ASpor", "https://www.aspor.com.tr/rss/anasayfa.xml"),
    ("Hürriyet", "https://www.hurriyet.com.tr/rss/spor"),
    ("TRT Spor", "https://www.trtspor.com.tr/rss/futbol.rss"),
    ("CNN Türk", "https://www.cnnturk.com/feed/rss/spor/news"),
    ("Habertürk", "https://www.haberturk.com/rss/spor.xml"),
    ("Sabah", "https://www.sabah.com.tr/rss/spor.xml"),
]

_parser = etree.XMLParser(recover=True, resolve_entities=False)
_TAG_RE = re.compile(r"<[^>]+>")


def _clean(text: str) -> str:
    if not text:
        return ""
    text = _TAG_RE.sub(" ", text)
    return " ".join(text.split()).strip()


def _parse_date(raw: str):
    if not raw:
        return None
    try:
        dt = parsedate_to_datetime(raw)
        if dt.tzinfo:
            dt = dt.astimezone(timezone.utc).replace(tzinfo=None)
        return dt
    except Exception:
        return None


def url_hash(url: str) -> str:
    return hashlib.sha256(url.strip().encode("utf-8")).hexdigest()[:32]


def fetch_feed(name: str, url: str) -> list[dict]:
    """Tek kaynağı çeker. Hata olursa boş liste (diğerleri etkilenmez)."""
    try:
        r = requests.get(url, impersonate="chrome", timeout=20)
        if r.status_code != 200:
            log.warning("RSS %s -> HTTP %s", name, r.status_code)
            return []
        root = etree.fromstring(r.content, parser=_parser)
        if root is None:
            return []
        out = []
        for item in root.findall(".//item"):
            link = _clean(item.findtext("link") or "")
            title = _clean(item.findtext("title") or "")
            if not link or not title:
                continue
            out.append({
                "source": name,
                "title": title,
                "summary": _clean(item.findtext("description") or "")[:600],
                "url": link,
                "url_hash": url_hash(link),
                "published_at": _parse_date(item.findtext("pubDate") or ""),
            })
        return out
    except Exception as e:
        log.warning("RSS %s -> hata: %s", name, e)
        return []


def fetch_all() -> list[dict]:
    """Tüm kaynakları tarar, url'e göre tekilleştirir."""
    seen = set()
    items = []
    for name, url in FEEDS:
        for it in fetch_feed(name, url):
            if it["url_hash"] in seen:
                continue
            seen.add(it["url_hash"])
            items.append(it)
    return items
