import ast
import csv
import hashlib
import importlib.metadata
import json
import pathlib
import subprocess

root = pathlib.Path('/work')
mma = pathlib.Path('/opt/mmaction2')
yowo = pathlib.Path('/opt/yowov2')
ntu = [s.strip() for s in (mma/'tools/data/skeleton/label_map_ntu60.txt').read_text().splitlines() if s.strip()]
tree = ast.parse((yowo/'config/dataset_config.py').read_text())
assignment = next(n for n in tree.body if isinstance(n,ast.Assign) and any(isinstance(t,ast.Name) and t.id=='dataset_config' for t in n.targets))
dataset = ast.literal_eval(assignment.value)
ava = list(dataset['ava_v2.2']['label_map'])
assert len(ntu)==60 and len(ava)==80
counts={}
for name,labels,start in [('stgcnpp',ntu,0),('posec3d',ntu,0),('ava_slowonly',ava,1),('yowov2',ava,0)]:
    with (root/'reports'/('classes_'+name+'.csv')).open('w',newline='') as f:
        w=csv.writer(f);w.writerow(['output_index','class_name'])
        w.writerows(enumerate(labels,start))
    counts[name]=len(labels)
versions={n:importlib.metadata.version(n) for n in ('torch','torchvision','numpy','mmcv-lite','mmengine','mmaction2','opencv-python-headless','importlib-metadata')}
(root/'reports/environment.json').write_text(json.dumps(versions,indent=2))
(root/'reports/pip_freeze.txt').write_bytes(subprocess.check_output(['python','-m','pip','freeze']))
licenses={}
for name,path in [('mmaction2',mma),('yowov2',yowo)]:
    files=[p for p in path.iterdir() if p.is_file() and p.name.lower().startswith(('license','notice'))]
    licenses[name]=[]
    for p in files:
        raw=p.read_bytes()
        (root/'reports'/(name+'_'+p.name)).write_bytes(raw)
        licenses[name].append(dict(file=p.name,sha256=hashlib.sha256(raw).hexdigest()))
notes=dict(class_counts=counts,ava_slowonly_background_index=0,
    ava_label_source='Official YOWOv2 AVA80 label_map; canonical AVA id = index + 1',
    score_semantics={'stgcnpp':'60 logits; standard prediction softmax',
                     'posec3d':'60 logits; standard prediction softmax',
                     'ava_slowonly':'81 logits; sigmoid, exclude background index0',
                     'yowov2':'bbox objectness separate from 80 sigmoid action scores'},
    source_license_files=licenses,
    use_conditions='Source license files preserved. Pretrained weights/dataset rights are separate; deployment/commercial clearance not established by this preparation.',
    no_fight_mapping=True,no_cross_model_probability_equivalence=True)
(root/'reports/catalog.json').write_text(json.dumps(notes,indent=2))
print(json.dumps(notes))
