"""Inherited finite one-worker job runner. No scheduler or numerical threads.
Monitor availability is checked before a worker starts. Every attempt is retained.
"""
import argparse,datetime,json,os,pathlib,resource,signal,subprocess,sys,time
ROOT=pathlib.Path(__file__).resolve().parent
MODES=('fixtures','freeze','smoke','full','rerun','audit')
def main():
    p=argparse.ArgumentParser();p.add_argument('mode',choices=MODES);mode=p.parse_args().mode
    ledger=ROOT/'attempts.json';old=json.loads(ledger.read_text()) if ledger.exists() else []
    prior=json.loads((ROOT/'inherited-ledger.json').read_text());cfg=json.loads((ROOT/'config.json').read_text());limit=cfg['resources']
    timeout=limit['full_job_timeout'] if mode=='full' else limit['other_job_timeout']
    if prior['cpu_seconds']+limit['setup_analysis_allowance_seconds']+sum(x['cpu_seconds'] for x in old)+timeout>3600 or prior['wall_seconds']+limit['setup_analysis_allowance_seconds']+sum(x['wall_seconds'] for x in old)+timeout>5400:raise SystemExit('aggregate reservation unavailable')
    env=dict(os.environ,OMP_NUM_THREADS='1',OPENBLAS_NUM_THREADS='1',MKL_NUM_THREADS='1',VECLIB_MAXIMUM_THREADS='1',NUMEXPR_NUM_THREADS='1',PYTHONDONTWRITEBYTECODE='1')
    # Preflight prevents an unmonitored worker being left alive on ps denial.
    try:
        check=subprocess.run(['ps','-p',str(os.getpid()),'-o','pid=,ppid=,rss='],capture_output=True,text=True)
    except PermissionError:
        old.append(dict(mode=mode,returncode=1,failure='monitor preflight PermissionError; no worker launched',cpu_seconds=1,wall_seconds=1,peak_sampled_tree_rss_bytes=None));ledger.write_text(json.dumps(old,indent=2)+'\n');raise
    if check.returncode:
        old.append(dict(mode=mode,returncode=1,failure='monitor preflight unavailable; no worker launched',cpu_seconds=1,wall_seconds=1,peak_sampled_tree_rss_bytes=None));ledger.write_text(json.dumps(old,indent=2)+'\n');raise SystemExit(check.stderr)
    def limits():
        os.setsid();resource.setrlimit(resource.RLIMIT_CPU,(timeout,timeout+1));resource.setrlimit(resource.RLIMIT_FSIZE,(48*1024**2,48*1024**2))
    start=time.monotonic();usage=resource.getrusage(resource.RUSAGE_CHILDREN);stamp=datetime.datetime.now(datetime.timezone.utc).isoformat();log=ROOT/f'{len(old)+1:02d}-{mode}.log';reason=None;peak=0;samples=0
    command=[sys.executable,'reaggregate.py'] if mode=='audit' else [sys.executable,'experiment.py',mode]
    with log.open('x') as output:
        child=subprocess.Popen(command,cwd=ROOT,env=env,stdout=output,stderr=subprocess.STDOUT,preexec_fn=limits)
        while child.poll() is None:
            sample=subprocess.run(['ps','-axo','pid=,ppid=,rss='],capture_output=True,text=True)
            if sample.returncode:reason='RSS monitor failed'
            table=[tuple(map(int,r.split())) for r in sample.stdout.splitlines() if len(r.split())==3];ids={child.pid}
            for _ in range(4):ids.update(pid for pid,ppid,rss in table if ppid in ids)
            peak=max(peak,sum(rss*1024 for pid,ppid,rss in table if pid in ids));samples+=1
            if peak>limit['rss_bytes']:reason='sampled process-tree RSS ceiling'
            if time.monotonic()-start>timeout:reason='job wall ceiling'
            if sum(f.stat().st_size for f in ROOT.rglob('*') if f.is_file())>limit['retained_bytes']:reason='artifact ceiling'
            if reason:os.killpg(child.pid,signal.SIGKILL);break
            time.sleep(.1)
        rc=child.wait()
    end=resource.getrusage(resource.RUSAGE_CHILDREN)
    record=dict(mode=mode,started_utc=stamp,returncode=rc,failure=reason,cpu_seconds=end.ru_utime+end.ru_stime-usage.ru_utime-usage.ru_stime,wall_seconds=time.monotonic()-start,peak_sampled_tree_rss_bytes=peak,samples=samples,timeout_seconds=timeout,
                inherited_cpu_seconds=prior['cpu_seconds'],inherited_wall_seconds=prior['wall_seconds'],setup_analysis_allowance_seconds=limit['setup_analysis_allowance_seconds'],enforcement='one worker, CPU/file-size rlimits; 100 ms sampled process-tree RSS/wall/artifact watchdog, not instantaneous RSS guarantee')
    old.append(record);ledger.write_text(json.dumps(old,indent=2)+'\n')
    if mode=='full' and rc and (ROOT/'status.json').exists():
        s=json.loads((ROOT/'status.json').read_text());s.update(active_run=False,execution_status='stopped',worker_returncode=rc,worker_failure=reason);(ROOT/'status.json').write_text(json.dumps(s,indent=2)+'\n')
    print(log.read_text()[-8000:]);print(json.dumps(record));raise SystemExit(rc or bool(reason))
if __name__=='__main__':main()
