# fetch_rss.py
"""RSS через feedparser (сетевой вызов с таймаутом, потом парсинг байтов)."""
from calendar import timegm
from datetime import datetime, timezone
from typing import List, Tuple
from urllib.parse import urlparse

import feedparser
import requests


def _entry_date(e) -> str:
    for key in ("published_parsed", "updated_parsed"):
        t = e.get(key)
        if t:
            return datetime.fromtimestamp(timegm(t), tz=timezone.utc).isoformat()
    return ""


def entries_from_parsed(feed_url: str, parsed) -> List[dict]:
    source = urlparse(feed_url).netloc.replace("www.", "")
    out = []
    for e in parsed.entries:
        entry_id = e.get("id") or e.get("link") or e.get("title") or ""
        if not entry_id:
            continue
        out.append({
            "feed_url": feed_url,
            "source": source,
            "entry_id": entry_id,
            "title": e.get("title", ""),
            "link": e.get("link", ""),
            "published": _entry_date(e),
            "summary": e.get("summary", ""),
        })
    return out


def fetch_feeds(feeds, session=None) -> Tuple[List[dict], dict]:
    http = session or requests
    records, errors = [], {}
    for url in feeds:
        try:
            resp = http.get(url, timeout=30, headers={"User-Agent": "mars-trendwatch/1.0"})
            resp.raise_for_status()
            records += entries_from_parsed(url, feedparser.parse(resp.content))
        except requests.RequestException as exc:
            errors[url] = str(exc)
    return records, errors
