"""External task, oracle, scoring. Neither constructor nor runtime imports this."""
import random
from common import seed, DEADLINE, GAP
VERSION='signed-last-write-select-settled-v2'
def events(namespace,group,K,episode):
    rng=random.Random(seed(namespace,'ordinary',group,episode)); out=[]; t=0; queries=0
    signs=[1,-1]*(K//2); random.Random(seed(namespace,'initial-signs',group,episode,K)).shuffle(signs)
    for i in range(64):
        u,v,w,g=rng.random(),rng.random(),rng.random(),rng.randrange(101)
        kind='W' if i<K or (u<.35 and queries+64-i>32) else 'Q'
        a=i if i<K else int(v*K)
        value=signs[i] if i<K else (1 if w<.5 else -1) if kind=='W' else 0
        out.append(dict(id=i,t=t,kind=kind,a=a,v=value)); queries+=kind=='Q'; t+=GAP+g
    assert queries>=32
    return out
def oracle(stream,K):
    bank=[0]*K; last=[None]*K; targets={}
    for e in stream:
        if e['kind']=='W': bank[e['a']]=e['v']; last[e['a']]=e['t']
        else: targets[e['id']]=dict(value=bank[e['a']],retention=e['t']-last[e['a']])
    return targets
def score(e,target,responses):
    r=[x for x in responses if x['id']==e['id']]
    missing=not r; duplicate=len(r)>1; incorrect=any(x['v']!=target for x in r)
    late=any(not (1<=x['t']-e['t']<=DEADLINE) for x in r)
    ok=len(r)==1 and not incorrect and not late
    return dict(success=int(ok),missing=int(missing),incorrect=int(incorrect),duplicate=int(duplicate),late=int(late),
                responses=r,latency=r[0]['t']-e['t'] if len(r)==1 else None)
