"""HackerNews-Helper — Algolia Search REST, Score>50, 24h-Window."""
from __future__ import annotations

import datetime as dt
import json
import logging
import urllib.parse
import urllib.request

log = logging.getLogger(__name__)

ALGOLIA_URL = "https://hn.algolia.com/api/v1/search"
USER_AGENT = "aria-radar/0.1 (+aseckzai@gmail.com)"
TIMEOUT_SECONDS = 15


def fetch(*, since: dt.datetime, min_points: int = 50, max_items: int = 20) -> list[dict]:
    """Search HN stories with score>min_points since `since`."""
    since_unix = int(since.timestamp())
    params = {
        "tags": "story",
        "numericFilters": f"points>{min_points},created_at_i>{since_unix}",
        "hitsPerPage": str(max_items),
    }
    url = f"{ALGOLIA_URL}?{urllib.parse.urlencode(params)}"
    req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})

    with urllib.request.urlopen(req, timeout=TIMEOUT_SECONDS) as resp:
        payload = json.loads(resp.read())

    items: list[dict] = []
    for hit in payload.get("hits", []):
        story_url = hit.get("url") or f"https://news.ycombinator.com/item?id={hit.get('objectID')}"
        items.append({
            "title": hit.get("title", "(untitled)"),
            "url": story_url,
            "date": dt.datetime.fromtimestamp(hit.get("created_at_i", since_unix), dt.timezone.utc).isoformat(),
            "source": "hackernews",
            "score": hit.get("points"),
            "raw": {
                "objectID": hit.get("objectID"),
                "num_comments": hit.get("num_comments"),
                "author": hit.get("author"),
                "hn_url": f"https://news.ycombinator.com/item?id={hit.get('objectID')}",
            },
        })
    log.info("hackernews: %d items", len(items))
    return items


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