"""Verify all stored entries of T498 by independent exact algebraic brackets."""
import os,sys,json
from decimal import Decimal
from fractions import Fraction
import numberdb.sage as numberdb
from numberdb._write import attach
from sage.rings.rational_field import QQ
from sage.rings.real_arb import RealBallField
from checks import independent_form
from generate import LatticeSecondMoments
key=sys.stdin.read().strip()
os.environ['NUMBERDB_API_KEY']=key
client=numberdb.Client(api_key=key)
d=numberdb.table('T498',client=client)
rows=[]
for family,group in d['Numbers'].items():
    for n,value in group.items():
        item=dict(value) if isinstance(value,dict) else {'number':value}
        item['params']={'family':family,'n':n}
        rows.append(item)
assert len(rows)==114
assert list(d['Parameters'])==['family','n']
g=LatticeSecondMoments()
assert [(r['params']['family'],int(r['params']['n'])) for r in rows]==[(p['family'],p['n']) for p in g.enumerate()]
exact=0; approximate=0; largest=0
for r in rows:
    f,n=r['params']['family'],int(r['params']['n'])
    a,b=independent_form(f,n)
    true_power=a**n*b
    s=r['number'];largest=max(largest,len(s))
    if '.' not in s and 'e' not in s.lower():
        x=QQ(s);assert x>0 and x**n==true_power,(f,n,s);exact+=1
    else:
        centre=Fraction(s)
        exponent=Decimal(s).as_tuple().exponent
        unit=Fraction(10)**exponent
        lo=QQ((centre.numerator,centre.denominator))-QQ((unit.numerator,unit.denominator))
        hi=QQ((centre.numerator,centre.denominator))+QQ((unit.numerator,unit.denominator))
        assert 0<lo and lo**n<true_power<hi**n,(f,n,s)
        assert len(Decimal(s).as_tuple().digits)>=100
        approximate+=1
assert (exact,approximate)==(26,88)
# Execute the exact snippet stored in Programs.
ns={'QQ':QQ,'RealBallField':RealBallField}
exec(d['Programs']['program-sage']['code'],ns)
assert ns['G'].overlaps(RealBallField(400)(5)/(36*RealBallField(400)(3).sqrt()))
r=g.verify(sample=None,client=client)
assert r.ok
print('READBACK: 114 independent exact nth-power bracket checks passed; 26 exact fractions, 88 intervals of 100 significant digits.')
print('Parameter and entry order: correct. Stored Sage snippet: passed. Longest stored value:',largest)
print('VERIFY',r)
print('STORED_DOCUMENT_JSON',json.dumps(d,ensure_ascii=False))
