"""Readback verification for the private draft T685, with no writes."""
import os,sys,json
from pathlib import Path
import numberdb.sage as numberdb
from sage.rings.real_arb import RealBallField
from generate import MultipleMahler,moment
from checks import low_order_controls,written_interval,assert_written_contains,decimal_rational
key=sys.stdin.read().strip()
if '=' in key and key.split('=',1)[0].strip().isidentifier(): key=key.split('=',1)[1].strip().strip('\"\'')
os.environ['NUMBERDB_API_KEY']=key
report=MultipleMahler().verify(sample=None)
print(report,flush=True); assert report.ok
doc=numberdb.table('T685'); R=RealBallField(650)
controls=low_order_controls(); balls={};records=[]
evidence=json.loads((Path(__file__).parent/'numerical-evidence.json').read_text())
independent={(e['n'],e['k']):e['independent_125d'] for e in evidence['entries']}
for n in (3,4):
 for k in range(1,13):
  text=doc['Numbers'][str(n)][str(k)]['number']
  assert_written_contains(text,moment(n,k,140))
  if (n,k) in controls: assert_written_contains(text,controls[(n,k)])
  lo,hi=written_interval(text)
  assert lo<decimal_rational(independent[(n,k)])<hi
  balls[n,k]=R((lo+hi)/2).add_error(R((hi-lo)/2))
  records.append({'n':n,'k':k,'high_precision_ball_contained':True,'independent_quadrature_inside':True})
for n in (3,4):
 for k in range(1,13):
  assert balls[n,k]>0
  if k<12: assert balls[n,k+1]<R(2).log()*balls[n,k]
  if 1<k<12: assert balls[n,k]**2<balls[n,k-1]*balls[n,k+1]
# Actual existing boundary values, with their own written precision.
companion=numberdb.table('T283')
for n in (3,4): assert_written_contains(companion['Numbers'][str(n)]['number'],controls[(n,1)])
# Verify declared entry keys and ingredients against the live companions.
for tid,keys,expected in [('T14',['3'],R(3).zeta()),
 ('T175',['2','1/3'],controls[(3,1)]*R.pi()),
 ('T175',['4','1/3'],(controls[(3,3)]+R(3).zeta())*2*R.pi()/9)]:
 entry=numberdb.table(tid)['Numbers']
 for keypart in keys: entry=entry[keypart]
 assert_written_contains(entry if isinstance(entry,str) else entry['number'],expected)
print('READBACK '+json.dumps({'table':'T685','generator_verify_ok':bool(report.ok),
 'entries':records,'stored_properties_checked':True,'low_order_controls':5,
 'T283_boundary_containment':True,'live_ingredient_containment':3}),flush=True)
