import json, pathlib, re, collections, statistics as st
from materials import *
from run_experiment import CONDS
ORDER = list(CONDS); TS = list(TASKS); N = 8
EMOJI = re.compile("[\U0001F300-\U0001FAFF☀-➿]")
KEI = re.compile(r"(です|ます|ました|でした|ません|ください|ましょう|でしょう)[ねよかな]?[」）)]?$")
def text(c,t,i): return pathlib.Path(f"runs/{c}_{t}_{i}.txt").read_text().strip()
def sents(x): return [s.strip() for s in re.split(r"[。\n]", x) if s.strip()]
def kei_rate(x):
    s = sents(x); return sum(bool(KEI.search(a)) for a in s) / len(s)
def mean_len(x):
    s = sents(x); return sum(len(a) for a in s) / len(s)
posts = [re.sub(r"^\d+：", "", l) for l in PAST]
def windows(s, n=10): return {s[k:k+n] for k in range(len(s)-n+1)}
def shown_windows(n): return set().union(*[windows(p) for p in posts[:n]])
NOTE_WORDS = re.compile("ストーブ|作り直|去年の豆|常連|飲み比べ|半分くらい")
print(f"本人の過去30本: 敬体率 {st.mean(kei_rate(p) for p in posts):.2f}  平均文長 {st.mean(mean_len(p) for p in posts):.1f}字  ！{sum('！' in p for p in posts)} 絵文字{sum(bool(EMOJI.search(p)) for p in posts)}")
print("条件     件 敬体率 文長 ！ 絵文字 メタ 見本丸写し 古い情報 メモ語")
rows = {}
for c in ORDER:
    n = CONDS[c][0]; W = shown_windows(n) if n else set()
    stale = [s for s in STALE if any(s in p for p in posts[:n])]
    m = collections.Counter(); kr = []; ml = []
    for t in TS:
        for i in range(N):
            x = text(c,t,i); m["n"] += 1; kr.append(kei_rate(x)); ml.append(mean_len(x))
            m["excl"] += ("！" in x); m["emoji"] += bool(EMOJI.search(x))
            m["meta"] += bool(re.search("【|\\[|資料|空け", x))
            m["copy"] += any(w in x for w in W); m["stale"] += any(s in x for s in stale)
            m["notes"] += bool(NOTE_WORDS.search(x))
    rows[c] = dict(kei=st.mean(kr), len=st.mean(ml), **m)
    print(f"{c:7}{m['n']:3} {st.mean(kr):.2f} {st.mean(ml):5.1f}{m['excl']:3}{m['emoji']:4}{m['meta']:4}{m['copy']:5}{m['stale']:5}{m['notes']:5}")
R = {}
for who in ["claude","codex"]:
    ranks = collections.defaultdict(list); byt = collections.defaultdict(lambda: collections.defaultdict(list)); ver = collections.defaultdict(collections.Counter)
    for t in TS:
        for i in range(N):
            j = json.loads(pathlib.Path(f"judge/{who}_{t}_{i}.json").read_text()); o = j["order"]
            for pos, k in enumerate(j["rank"]):
                c = o[int(k)-1]; ranks[c].append(pos+1); byt[t][c].append(pos+1)
            for k, v in j["verdicts"].items(): ver[o[int(k)-1]][v] += 1
    R[who] = {c: dict(avg=st.mean(ranks[c]), **{t: st.mean(byt[t][c]) for t in TS}, ver=dict(ver[c])) for c in ORDER}
    print("\n##", who, "平均順位  そのまま/小修正/論点違い/不可")
    for c in sorted(ORDER, key=lambda c: R[who][c]["avg"]):
        v = ver[c]; print(f"{c:7} {R[who][c]['avg']:.2f}  " + "/".join(str(v[x]) for x in ["そのまま出せる","小修正で出せる","論点から違う","不可"]) + "  " + " ".join(f"{t}={R[who][c][t]:.1f}" for t in TS))
print("\n## 2系統の平均")
for c in sorted(ORDER, key=lambda c: R['claude'][c]['avg']+R['codex'][c]['avg']):
    print(f"{c:7} {(R['claude'][c]['avg']+R['codex'][c]['avg'])/2:.2f}  " + " ".join(f"{t}={(R['claude'][c][t]+R['codex'][c][t])/2:.1f}" for t in TS))
json.dump({"style": rows, "rank": R}, open("rank_summary.json","w"), ensure_ascii=False, indent=1)
