import streamlit as st
import requests
import pandas as pd

GAMMA = "https://gamma-api.polymarket.com"
DATA  = "https://data-api.polymarket.com"

@st.cache_data(ttl=90)
def list_elon_tweet_markets(limit: int = 300) -> pd.DataFrame:
    """ONLY returns active markets with slug/title containing elon-musk-of-tweets*"""
    url = f"{GAMMA}/markets"
    params = {"active": "true", "closed": "false", "limit": limit, "order": "volume24hr", "ascending": "false"}
    
    try:
        r = requests.get(url, params=params, timeout=15)
        r.raise_for_status()
        markets = r.json()
        
        filtered = []
        for m in markets:
            slug = m.get("slug", "").lower()
            q = m.get("question", "").lower()
            if "elon-musk-of-tweets" in slug or ("elon" in slug and ("tweet" in slug or "tweets" in slug)) or ("elon" in q and ("tweet" in q or "tweets" in q)):
                filtered.append({
                    "title": m.get("question", "Elon Tweet Count Market"),
                    "slug": m.get("slug", ""),
                    "yes_%": round(float(m.get("lastTradePrice", 0)) * 100, 1),
                    "volume_24h": round(float(m.get("volume24hr", 0)), 0),
                    "liquidity": round(float(m.get("liquidity", 0)), 0),
                    "ends": m.get("endDate", "")[:10],
                    "condition_id": m.get("conditionId", ""),
                    "link": f"https://polymarket.com/{m.get('slug', '')}"
                })
        
        return pd.DataFrame(filtered).sort_values("volume_24h", ascending=False)
        
    except Exception as e:
        st.error(f"Polymarket Gamma API error: {e}")
        return pd.DataFrame()

@st.cache_data(ttl=60)
def get_market_trades(condition_id: str, limit: int = 100) -> pd.DataFrame:
    """Recent trades (txns) on the chosen Elon tweet market"""
    if not condition_id: return pd.DataFrame()
    url = f"{DATA}/trades"
    params = {"market": condition_id, "limit": limit, "takerOnly": "true"}
    try:
        r = requests.get(url, params=params, timeout=12)
        r.raise_for_status()
        df = pd.DataFrame(r.json())
        if df.empty: return pd.DataFrame()
        df["time"] = pd.to_datetime(df["timestamp"], unit="ms")
        return df[["time", "side", "outcome", "size", "price", "proxyWallet"]].rename(columns={"proxyWallet": "user"})
    except:
        return pd.DataFrame()

@st.cache_data(ttl=180)
def get_top_holders(condition_id: str, top_n: int = 20) -> pd.DataFrame:
    """Top buyers & sellers (share holders) on the Elon tweet market"""
    if not condition_id: return pd.DataFrame()
    url = f"{DATA}/holders"
    params = {"market": condition_id, "limit": top_n, "minBalance": 1}
    try:
        r = requests.get(url, params=params, timeout=12)
        r.raise_for_status()
        data = r.json()
        rows = []
        for item in data:
            for h in item.get("holders", []):
                rows.append({
                    "user": h.get("proxyWallet", "")[:8] + "...",
                    "outcome": "Yes" if h.get("outcomeIndex") == 0 else "No",
                    "shares": h.get("amount", 0),
                    "name": h.get("pseudonym", "Anonymous")
                })
        return pd.DataFrame(rows).sort_values("shares", ascending=False)
    except:
        return pd.DataFrame()
