"""Synthetic event data and symbolic scoring oracle; never imported by the model."""
import hashlib, random

def seed(namespace,group,kind,index=0):
    return int.from_bytes(hashlib.sha256(f'{namespace}/{group}/{kind}/{index}'.encode()).digest()[:8],'big')

def permutations(K,C,value):
    rng=random.Random(value);out=[]
    for _ in range(C):
        row=list(range(K));rng.shuffle(row);out.append(tuple(row))
    return tuple(out)

def oracle(events,pi,K,initial=None):
    bank=[0]*K if initial is None else list(initial);answers=[]
    for e in events:
        if e['type']=='WRITE':bank[e['a']]=e['v'];answers.append(None)
        elif e['type']=='QUERY':answers.append(bank[pi[e['c']][e['j']]])
        else:raise ValueError('Unknown event')
    return answers,bank

def episode(K,C,pi,value):
    rng=random.Random(value);events=[];last=[None]*K;queries=0;bins=[0,0,0]
    for t in range(128):
        force=(128-t)<=64-queries
        if t<K or (not force and rng.random()<.25):
            a=t if t<K else rng.randrange(K);e={'type':'WRITE','a':a,'v':rng.choice([-1,1])};last[a]=t
        else:
            eligible=[[a for a in range(K) if last[a] is not None and lo<=t-last[a]<=hi] for lo,hi in [(1,8),(9,32),(33,64)]]
            available=[b for b,x in enumerate(eligible) if x]
            if not available:
                a=rng.randrange(K);e={'type':'WRITE','a':a,'v':rng.choice([-1,1])};last[a]=t
            else:
                b=rng.randrange(3)
                if not eligible[b]:b=rng.choice(available)
                a=rng.choice(eligible[b]);c=rng.randrange(C);j=pi[c].index(a);e={'type':'QUERY','c':c,'j':j,'delay':t-last[a]};queries+=1;bins[b]+=1
        events.append(e)
    if queries<64:raise ValueError('Query quota unavailable under declared refresh rule')
    answers,_=oracle(events,pi,K)
    return events,answers,{'queries':queries,'delay_bins':bins}
