import json, pathlib, sys
HERE=pathlib.Path(__file__).resolve().parent
sys.path.insert(0,str(HERE))
from totp_fixture import TOTPVerifier, RecoveryCodeStore, rfc_vectors_sha1
secret=b'12345678901234567890'
v=TOTPVerifier(secret)
results=[]
for t,expected in rfc_vectors_sha1():
    actual=v.code_at(t); results.append({'probe':'RFC_VECTOR','time':t,'expected':expected,'actual':actual,'pass':actual==expected})
# independent verifier so replay state from vectors is irrelevant
v=TOTPVerifier(secret,window=1,max_attempts=3)
code=v.code_at(1234567890)
ok,status=v.verify(code,1234567890); results.append({'probe':'TOTP_VALID','status':status,'pass':ok})
ok2,status2=v.verify(code,1234567890); results.append({'probe':'TOTP_REPLAY','status':status2,'pass':not ok2})
store=RecoveryCodeStore(); old=store.issue(['ALPHA-7K4P','BRAVO-2M8Q'])
ok3,s3=store.consume(old[0]); results.append({'probe':'RECOVERY_FIRST_USE','status':s3,'pass':ok3})
ok4,s4=store.consume(old[0]); results.append({'probe':'RECOVERY_REUSE','status':s4,'pass':not ok4})
store.regenerate(['DELTA-4H6R','ECHO-5J2S'])
ok5,s5=store.consume(old[1]); results.append({'probe':'OLD_SET_AFTER_REGEN','status':s5,'pass':not ok5})
print(json.dumps({'synthetic_only':True,'results':results,'events':v.events+store.events},indent=2))
raise SystemExit(0 if all(x['pass'] for x in results) else 1)
