import json
import pathlib
import sys
import time
import statistics
import numpy as np
sys.path.insert(0,'/source/tests')
from test_tracking_empty_update import ReferenceTracker
from app.byte_tracking import ByteTracker, TrackingSettings
from app.contracts.frames import FrameEnvelope,DetectionObservation

old,new=ReferenceTracker(TrackingSettings(frame_rate=10)),ByteTracker(TrackingSettings(frame_rate=10))
samples={'old':[],'new':[]}
for seq in range(110):
    frame=FrameEnvelope('test','test','test','test',1,seq,seq*100000000,0,1920,1080)
    classes=range(80) if seq<10 else () if seq<60 else range(2)
    data=tuple(DetectionObservation(frame,'RFDETRMedium',i,.9,
        ((i%20)*.04,(i//20)*.04,(i%20)*.04+.025,(i//20)*.04+.025)) for i in classes)
    results={}
    order=[('old',old),('new',new)] if seq%2 else [('new',new),('old',old)]
    for name,tracker in order:
        start=time.perf_counter_ns();results[name]=tracker.update(data);elapsed=(time.perf_counter_ns()-start)/1e6
        if seq>=70:samples[name].append(elapsed)
    assert results['old']==results['new']
out={k:{'mean_ms':statistics.mean(v),'p95_ms':float(np.percentile(v,95)),'n':len(v)} for k,v in samples.items()}
out.update(parity=True,frames=110,measured_frames=40,classes_retained=80,active_classes=2)
pathlib.Path('/evidence/paired.json').write_text(json.dumps(out,indent=2));print(json.dumps(out))
