"""v3q.py (A1.17): +5 min quality check for mc5. Only facts known before first swap + 300 s. Pick on H1, test on H2 once."""
import csv, collections, statistics as st, random, itertools, pickle
exec(open("/root/fwa1/v3frag.py").read().split("random.seed(7)")[0])
R = book(300, 2.5e5, 1e6)
tokof = {r[0]: r[1] for r in D.execute("SELECT pool, token FROM meta")}
HUB = {l.split()[0].lower() for l in open("/root/fwa1/v3/hubs.txt") if l.strip()} | {"0x0000000000000000000000000000000000000000", "0x000000000000000000000000000000000000dead"}
W2 = {r["tok"].lower() for r in csv.DictReader(open("/root/fwa1/v3/a214.csv"))}
F = {}
for p, v, why, t in R:
    pool, tok, is0, fee, cb, sup, dec = meta[p["pool"]]; fb = p["fb"]; lim = fb + int(300 / SPB)
    nb = ns = 0; be = se = 0.0
    for a0, a1 in D.execute("SELECT a0, a1 FROM sw WHERE pool=? AND b<?", (pool, lim)):
        we = (s256(a1) if is0 else s256(a0)) / 1e18
        if we > 0: nb += 1; be += we
        elif we < 0: ns += 1; se += -we
    bal = collections.defaultdict(int)
    for frm, too, val in D.execute("SELECT frm, too, v FROM tr WHERE token=? AND b<?", (tok, lim)):
        x = int(val, 16); bal[frm.lower()] -= x; bal[too.lower()] += x
    tot = sup * 10 ** dec
    hold = sorted((b for w, b in bal.items() if w not in HUB and w != pool.lower() and b > 0), reverse=True)
    top1 = hold[0] / tot if hold else 0; top10 = sum(hold[:10]) / tot if hold else 0
    pth = CACHE[p["pool"]][0]; i = state(pth, 300)
    f3, f1 = p["feats"][300], p["feats"][60]
    F[p["pool"]] = dict(nbuyw=f3["nbuy"], fresh=f3["nnew"] / f3["nbuy"] if f3["nbuy"] else 0, rep1=f3["rep1"], rep3=f3["rep3"],
        buyeth=f3["buyeth"], sellratio=se / be if be else 0, nsell=ns, nbuytx=nb, top1=top1, top10=top10,
        poolweth=pth[i][4], slope=(f3["mc"] / f1["mc"]) if f1["mc"] else 9, offhigh=f3["mc"] / f3["mcmax"] if f3["mcmax"] else 1)
pickle.dump(F, open("/root/fwa1/v3/qfeat.pkl", "wb"))
H1 = [r for r in R if r[0]["t"] < CUT]; H2 = [r for r in R if r[0]["t"] >= CUT]
def lab(r): return "w2" if tokof[r[0]["pool"]].lower() in W2 else ("1M" if r[0]["t1m"] else "no")
print("feature medians by group (all days): w2 coins / hit $1M not w2 / never $1M")
for k in F[R[0][0]["pool"]]:
    g = collections.defaultdict(list)
    for r in R: g[lab(r)].append(F[r[0]["pool"]][k])
    print("  %-10s %8.3f %8.3f %8.3f" % (k, st.median(g["w2"]), st.median(g["1M"]), st.median(g["no"])))
QS = {k: sorted(F[r[0]["pool"]][k] for r in H1) for k in F[R[0][0]["pool"]]}
def cuts(k): q = QS[k]; return sorted({q[int(len(q) * f)] for f in (.2, .35, .5, .65, .8)})
rules = []
for k in QS:
    for c in cuts(k):
        rules.append(((k, ">=", c),)); rules.append(((k, "<", c),))
def ok(r, rule): return all((F[r[0]["pool"]][k] >= c) if op == ">=" else (F[r[0]["pool"]][k] < c) for k, op, c in rule)
def score(S): v = [r[1] for r in S]; return (st.mean(sorted(v)[:-3]) if len(v) > 8 else 0)   # mean without top 3: robust pick
single = sorted([(score([r for r in H1 if ok(r, ru)]), ru) for ru in rules if sum(ok(r, ru) for r in H1) >= 12], key=lambda x: -x[0])
pairs = []
for (s1, a), (s2, b) in itertools.combinations(single[:20], 2):
    if a[0][0] == b[0][0]: continue
    ru = a + b; S = [r for r in H1 if ok(r, ru)]
    if len(S) >= 12: pairs.append((score(S), ru))
pairs.sort(key=lambda x: -x[0])
def rep(name, ru):
    for h, S in (("H1", H1), ("H2", H2)):
        K = [r for r in S if ok(r, ru)]; v = [r[1] for r in K]
        if not v: print("  %s %s n0" % (name, h)); continue
        nd = len({day(r[0]["t"]) for r in S})
        g = collections.Counter(lab(r) for r in K); gall = collections.Counter(lab(r) for r in S)
        print("  %s %s n%d (%.1f/day) mean %.2fx med %.2fx w/o top3 %.2fx $%.0f/day | kept w2 %d/%d, 1M %d/%d, never %d/%d" % (name, h, len(v), len(v) / nd,
              st.mean(v), st.median(v), st.mean(sorted(v)[:-3]) if len(v) > 3 else 0, sum(x - 1 for x in v) * 100 / nd, g["w2"], gall["w2"], g["1M"], gall["1M"], g["no"], gall["no"]))
print("\nbase"); rep("all", ())
print("\nbest single rules on H1 (score = H1 mean without top 3)")
for s, ru in single[:6]: print(" ", ru); rep("   ", ru)
print("\nbest pairs on H1")
for s, ru in pairs[:5]: print(" ", ru); rep("   ", ru)
pickle.dump((single[:6], pairs[:5]), open("/root/fwa1/v3/qpick.pkl", "wb"))
