"""Synthetic canonical observations; no model inference or accuracy claims."""
from dataclasses import replace
from app.contracts.frames import FrameEnvelope, DetectionObservation
from app.crowd_config import CROWD_MODEL, CrowdConfig
from app.crowd_scenario import Crowd

class Clock:
    def __init__(self): self.value=0.
    def __call__(self): return self.value

def frame(t=0., seq=None, **changes):
    value=FrameEnvelope('server','1','stream','run',1,
        round(t*1000) if seq is None else seq,round(t*1e9),0,1280,720,'v1')
    return replace(value,**changes)

def obs(f, cls=0, score=.9, box=(.1,.1,.3,.4), **changes):
    return replace(DetectionObservation(f,CROWD_MODEL,cls,score,box),**changes)

def observations(f, p=1, h=1):
    return tuple(obs(f,c,box=((i%20)/20,(i//20)/20,(i%20)/20+.025,(i//20)/20+.025))
                 for c,n in ((0,p),(1,h)) for i in range(n))

def engine(**settings):
    clock=Clock()
    return Crowd(CrowdConfig(enabled=True,**settings),clock=clock),clock

def feed(e,t,p=1,h=1,**frame_changes):
    f=frame(t,**frame_changes)
    return e.evaluate(f,observations(f,p,h))
