"""X chatter around each candidate coin on basket BUY days (Solana + Base baskets, 2023-26). 1 page per window -> posts/day estimate."""
import pickle, json, os, calendar, datetime as dt, concurrent.futures as cf, xq, time
TR = pickle.load(open('trades_new_50.pkl', 'rb')); D = pickle.load(open('data_new.pkl', 'rb'))
pairs = set()
for t in TR:
    if not (t['k'].startswith('sol_') or t['k'].startswith('base_')): continue
    rows = [r for r in t['rows'] if D['H'][r['c']][t['entry']][2] >= 100000][:20]
    if len(rows) < 6: continue
    for r in rows: pairs.add((r['c'], t['entry']))
OUT = 'xdata.json'; res = json.load(open(OUT)) if os.path.exists(OUT) else {}
def ts(d): return calendar.timegm(dt.date.fromisoformat(d).timetuple())
def parse(s): return dt.datetime.strptime(s, '%a %b %d %H:%M:%S %z %Y').timestamp()
def window(q, end_day, days=7):
    b = ts(end_day) + 86400; a = b - days * 86400
    r = xq.search('%s since_time:%d until_time:%d' % (q, a, b)); tw = r.get('tweets', [])
    if not tw: return dict(n=0, rate=0.0, authors=0, likes=0)
    tt = [parse(x['createdAt']) for x in tw]
    full = bool(r.get('has_next_page'))
    span = max(60, (max(tt) - min(tt))) if full else days * 86400
    return dict(n=len(tw), rate=len(tw) / span * 86400, authors=len({x['author']['userName'] for x in tw}), likes=sum(x.get('likeCount') or 0 for x in tw) / len(tw), full=full)
def job(p):
    c, d = p; key = '%s|%s' % (c, d)
    if key in res: return key, res[key]
    m = D['META'][c]; sym = m['sym']; addr = m.get('addr')
    q = ('$%s' % sym) if len(sym) >= 3 and sym.isalnum() and not sym.isdigit() else None
    q = '(%s OR %s)' % (q, addr) if q and addr else (q or addr)
    if not q: return key, None
    d14 = (dt.date.fromisoformat(d) - dt.timedelta(14)).isoformat()
    try: return key, dict(q=q, now=window(q, d), before=window(q, d14))
    except Exception as e: return key, dict(err=repr(e)[:100])
todo = sorted(pairs); t0 = time.time()
with cf.ThreadPoolExecutor(6) as ex:
    for i, (k, v) in enumerate(ex.map(job, todo)):
        res[k] = v
        if i % 100 == 0: json.dump(res, open(OUT, 'w')); print(i, round(time.time() - t0), flush=True)
json.dump(res, open(OUT, 'w')); print('done', len(res), sum(1 for v in res.values() if v and 'err' in v), 'errors')
