from __future__ import annotations

import json
import time
import urllib.parse
import urllib.request

PUMP_FEED = "https://frontend-api-v3.pump.fun/coins"


def _link(coin: dict, key: str) -> str | None:
    value = coin.get(key)
    return value if isinstance(value, str) and value.strip() else None


def score_coin(coin: dict) -> dict:
    links = {key: _link(coin, key) for key in ("twitter", "telegram", "website")}
    social_count = sum(value is not None for value in links.values())
    replies = int(coin.get("reply_count") or 0)
    market_cap = float(coin.get("usd_market_cap") or coin.get("market_cap") or 0)
    score = min(100, social_count * 15 + min(30, replies / 10) + (25 if market_cap >= 50_000 else 10 if market_cap >= 10_000 else 0))
    flags = []
    if social_count == 0:
        flags.append("no social links")
    if market_cap < 10_000:
        flags.append("very small market cap")
    if replies == 0:
        flags.append("no replies recorded")
    if not coin.get("mint"):
        flags.append("missing contract address")
    return {
        "mint": coin.get("mint"),
        "name": coin.get("name") or "Unnamed",
        "symbol": coin.get("symbol") or "?",
        "description": coin.get("description") or "",
        "image_uri": coin.get("image_uri"),
        "creator": coin.get("creator"),
        "created_timestamp": coin.get("created_timestamp"),
        "market_cap": market_cap,
        "reply_count": replies,
        "complete": bool(coin.get("complete")),
        "attention_score": round(score, 1),
        "risk_flags": flags,
        "social_links": links,
        "pump_url": f"https://pump.fun/coin/{coin.get('mint')}" if coin.get("mint") else None,
    }


def fetch_new_coins(limit: int = 30) -> list[dict]:
    params = urllib.parse.urlencode({"offset": 0, "limit": limit, "sort": "created_timestamp", "order": "DESC", "includeNsfw": "false"})
    request = urllib.request.Request(f"{PUMP_FEED}?{params}", headers={"User-Agent": "pump-research-dashboard/1.0"})
    with urllib.request.urlopen(request, timeout=20) as response:
        payload = json.loads(response.read().decode("utf-8"))
    return [score_coin(coin) for coin in payload]


def snapshot(limit: int = 30) -> dict:
    coins = fetch_new_coins(limit)
    return {"updated": int(time.time()), "source": PUMP_FEED, "coins": coins}
