import copy,json,time
from datetime import datetime,timezone
from informed_decision.policy import PolicyClient,CONTRACT,submitted_digest
pin='sha256:'+'b'*64
req={'id':'image-purpose-fixture','tenant':'tenant:platform','subject':{'id':'synthetic','type':'service','tenant':'tenant:platform'},'resource':{'id':'memo:fixture','type':'memo','system':'informed-decision','tenant':'tenant:platform'},'action':'register','context':{}}
class Transport:
 def request(self,*args,**kwargs):
  now=time.time(); stamp=lambda t:datetime.fromtimestamp(t,timezone.utc).isoformat()
  b={**copy.deepcopy({k:req[k] for k in ('tenant','subject','action','resource','context')}),'request_digest':'sha256:'+'e'*64,'submitted_request_digest':submitted_digest(req)}
  if self.purpose!='ABSENT':b['purpose']=self.purpose
  d={'id':'synthetic-decision','contract_version':CONTRACT,'request_id':req['id'],'effect':'allow','matched_policy_version':'v1','subject':req['subject'],'resource':req['resource'],'binding':b,'lifetime':{'kind':'ttl','not_before':stamp(now-1),'expires_at':stamp(now+60)},'provenance':{'policy_package':'fixture','policy_version':'v1','policy_package_digest':pin,'registry_snapshot_digest':'sha256:'+'c'*64,'evaluator':'flex-auth/fixture','decision_time':stamp(now)}}
  return 200,d
checks=[]
for purpose in ('ABSENT','','readback','enforcement','unknown',None,False,0,[],{}):
 t=Transport();t.purpose=purpose
 c=PolicyClient('https://fixture.invalid',lambda:'synthetic-only',package='fixture',version='v1',package_digest=pin,transport=t)
 o=c.check(req)
 if purpose in ('ABSENT',''):assert o.outcome=='allow';o.require_current(time.time())
 else:assert o.outcome=='invalid_decision' and o.decision_json is None
 checks.append(str(purpose))
print(json.dumps({'installed_image_purpose_variants':len(checks),'binding_forms_allowed':2,'advisory_or_malformed_refused':8,'synthetic_only':True,'native_provider':False}))
