import os, glob, json, re
BASE = os.path.dirname(os.path.abspath(__file__))
NI = os.path.join(BASE, 'New Images')
papers = {}
for f in os.listdir(NI):
    m = re.match(r'^(P[1-4])\.(.+?)(\.done)?(_illus_\d+)?\.(svg|png)$', f)
    if not m: continue
    papers.setdefault((m.group(1), m.group(2)), 0)
    papers[(m.group(1), m.group(2))] += 1
# index manifest folders -> (source_prefix, full dir) ; recursive to catch P1/_ingest/*
folders = {}
for f in glob.glob(os.path.join(BASE, '**', 'manifest.json'), recursive=True):
    d = os.path.dirname(f); base = os.path.basename(d)
    try: sp = (json.load(open(f, encoding='utf-8')).get('paper') or {}).get('source_prefix')
    except Exception: sp = None
    folders[base] = {'sp': sp, 'dir': os.path.relpath(d, BASE)}
out = []
for (lvl, short), cnt in sorted(papers.items()):
    L = lvl[1]
    rec = folders.get(short) or folders.get(f"p{L}-{short}")
    matched = rec['dir'] if rec else None
    sp = rec['sp'] if rec else None
    if not rec:
        toks = [t for t in short.split('-') if t]
        for b, r in folders.items():
            if (b.startswith(f"p{L}-") or b==short) and all(t in b for t in toks): sp = r['sp']; matched = r['dir']; break
    out.append({'level': lvl, 'short': short, 'files': cnt, 'folder': matched, 'source_prefix': sp})
json.dump(out, open(os.path.join(BASE, '_newimages_map.json'), 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
for r in out:
    print(f"{r['level']} {r['short']} ({r['files']}f) -> {r['folder']} :: {r['source_prefix']}")
print("matched:", sum(1 for r in out if r['source_prefix']), "/", len(out))
