"""browse/spaceships.json for the spaceship showroom (browse/spaceships.html): the newest version of every card made from a
spacecraft/v1 or hover/v1 job (job.json "contract"). usage: python3 tools/space/manifest_space.py"""
import json, os, subprocess, sys
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.insert(0, os.path.join(ROOT, 'lib'))
import card as cardlib  # noqa: E402

ORDER = ['fighters', 'alien', 'ships', 'pods', 'cruisers', 'battleships', 'motherships', 'speeders']
out = []


def job_json(job):
    p = f'{ROOT}/jobs/{job}/job.json'
    if os.path.exists(p):
        return json.load(open(p))
    r = subprocess.run(['git', '-C', ROOT, 'show', f'HEAD:jobs/{job}/job.json'], capture_output=True)
    return json.loads(r.stdout) if r.returncode == 0 else None


for jid, versions in cardlib.load_all(ROOT).items():
    c = versions[-1]
    job = (c.get('provenance') or {}).get('job')
    j = job_json(job) if job else None
    if not j or j.get('contract') not in ('spacecraft/v1', 'hover/v1'):
        continue
    m = c['size']['measured_m']
    files = c['files']
    blob = lambda k: (files.get(k) or ':').split(':')[1] or None
    out.append(dict(id=c['id'], slug=j['slug'], job=job, title=j.get('title') or c['name'], family=j['family'], version=c['version'],
                    contract=j['contract'], glb=blob('glb'), painted_glb=blob('painted_glb'), size=[m['w'], m['h'], m['l']],
                    tris=c['render']['tris'], bytes=c['render']['bytes'], gpu_mb=c['render']['gpu_mb_decoded'],
                    paints=c['paint']['paints'], paint_names=c['paint'].get('names'), nodes=c['nodes'],
                    gameplay=c.get('gameplay'), status=c['status'], release=c['release'], tags=j.get('tags') or [],
                    author=(c.get('provenance') or {}).get('author')))
out.sort(key=lambda v: (ORDER.index(v['family']) if v['family'] in ORDER else 99, v['size'][2]))
json.dump(out, open(f'{ROOT}/browse/spaceships.json', 'w'), indent=1)
print(len(out), 'spacecraft ->', 'browse/spaceships.json')
