"""Cron (every minute, under its own flock): take the next QUICK job (lighter copy, use-in-games) from the spike API store
on prod, run tools/lighter.py, publish, report back. Astra re-runs have their own lane (tools/rerun_worker.py), so a quick
job never waits 40 minutes behind one. Log: jobs/worker.log"""
import json, os, subprocess, sys, time
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LOG = open(f'{ROOT}/jobs/worker.log', 'a')


def prod(*args):
    out = subprocess.run(['ssh', 'prod', 'cd /home/forge/fal-feedback && python3 cli.py ' + ' '.join(f"'{a}'" for a in args)],
                         capture_output=True, text=True, timeout=60)
    return json.loads(out.stdout or '{}')


def log(t):
    LOG.write(time.strftime('%Y-%m-%dT%H:%M:%SZ ', time.gmtime()) + t + '\n'); LOG.flush()


def last(r):
    return ((r.stderr or '').strip().splitlines() or ['failed'])[-1][:300].replace("'", ' ')


j = prod('next', 'quick')
if not j:
    sys.exit(0)
kind, prm = j.get('kind'), j.get('params') or {}
log(f"quick job {j['id']} {kind} {j['asset']} {prm}")
if kind == 'lighter':
    prod('update', j['id'], 'running', 'making lighter tries and checking them on the GPU (1 to 3 min)')
    args = ['--target', str(prm['target'])] if prm.get('target') else []
    r = subprocess.run([sys.executable, f'{ROOT}/tools/lighter.py', j['asset'], *args], capture_output=True, text=True)
    log(r.stdout[-1500:] + r.stderr[-1500:])
    if r.returncode == 3:
        prod('update', j['id'], 'lean', last(r)); sys.exit(0)
    if r.returncode:
        prod('update', j['id'], 'failed', last(r)); sys.exit(0)
    ver = r.stdout.strip().splitlines()[-1]
    msg = f'v{ver} lighter copy made; publishing'
elif kind == 'activate':
    r = subprocess.run([sys.executable, f'{ROOT}/tools/lighter.py', '--activate', j['asset'], str(prm['version'])], capture_output=True, text=True)
    log(r.stdout[-500:] + r.stderr[-500:])
    if r.returncode:
        prod('update', j['id'], 'failed', last(r)); sys.exit(0)
    ver = r.stdout.strip().splitlines()[-1]
    msg = f'v{ver} goes to games; publishing'
else:
    prod('update', j['id'], 'failed', f'unknown job kind {kind}'); sys.exit(0)
prod('update', j['id'], 'running', msg)
p = subprocess.run([f"{ROOT}/tools/publish_lighter.sh"], capture_output=True, text=True)
log(p.stdout[-1000:] + p.stderr[-1000:])
if p.returncode:
    prod('update', j['id'], 'failed', f'v{ver} saved but publishing failed (worker.log)'); sys.exit(0)
slug = j['asset'].split('/')[1]
cls = j['asset'].split('/')[0].split('.')
paths = [f'cards/{"/".join(cls)}/{slug}', 'index.json'] + ([f'jobs/lighter-{slug}-v{ver}'] if kind == 'lighter' else [])
subprocess.run(['git', '-C', ROOT, 'add', '--', *paths], capture_output=True)
subprocess.run(['git', '-C', ROOT, 'commit', '-qm', f"{'lighter copy' if kind == 'lighter' else 'use in games'} {j['asset']} v{ver}",
                '--', *paths], capture_output=True)
prod('update', j['id'], 'done', f'v{ver} published' + (' (in games now)' if kind == 'activate' else ' as a draft'), ver)
log(f"quick job {j['id']} done v{ver}")
