"""make_gallery.py -- runs/gallery.json for gallery.html: every build, newest first (Ivy, Oct 23 2026: "Show me a collection of past
creations"). Called after every game by imagine.save_run; run by hand any time."""
import json, os, glob, re, time
HERE = os.path.dirname(os.path.abspath(__file__))
def build():
    me = {}
    try: me = json.load(open(os.path.join(HERE, 'self.json')))
    except Exception: pass
    who = {g['run']: name for name, games in (me.get('friends') or {}).items() for g in games}
    out = []
    for d in glob.glob(os.path.join(HERE, 'runs', '*', '')):
        run = os.path.basename(d.rstrip('/')); sp = os.path.join(d, 'state.json'); nbp = os.path.join(d, 'notebook.jsonl')
        if not os.path.exists(sp) or not os.path.exists(nbp): continue
        try: st = json.load(open(sp)); nb = [json.loads(l) for l in open(nbp)]
        except Exception: continue
        if not nb: continue
        frames = sorted(glob.glob(os.path.join(d, 'frame_*.png')), key=os.path.getmtime)
        frames = [f for f in frames if not re.search(r'_(views|back|top)\.png$', f)]
        if not frames: continue
        ideas = []
        for e in nb:
            mb = e.get('might_be')
            if mb and (not ideas or ideas[-1] != mb): ideas.append(mb)
        refl = st.get('reflection') or {}
        done = next((e.get('done_why') for e in nb if e.get('done')), None)
        out.append({'run': run, 'when': time.strftime('%b %d %-I:%M %p', time.localtime(os.path.getmtime(sp))), 't': os.path.getmtime(sp),
                    'frame': f"runs/{run}/{os.path.basename(frames[-1])}", 'title': refl.get('we_made') or (ideas[-1] if ideas else ''),
                    'journey': ideas[-4:], 'turns': len(nb), 'with': who.get(run) or (st.get('player') or 'Ivy' if run.startswith('coop') else None),   # every co-op game before names existed was Ivy's
                    'coop': run.startswith('coop'), 'ending': done or ('stopped' if st.get('stage') == 'stopped' else ''),
                    'loved': refl.get('loved'), 'request': st.get('request')})
    out.sort(key=lambda x: -x['t'])
    tmp = os.path.join(HERE, 'runs', 'gallery.json.tmp'); json.dump(out, open(tmp, 'w')); os.replace(tmp, os.path.join(HERE, 'runs', 'gallery.json'))
    return out
if __name__ == '__main__':
    g = build(); print(len(g), 'creations;', sum(x['coop'] for x in g), 'made together')
