"""Read-only verification supporting the T623 navigation repair.

Run: sage -python repair_check.py
Download generate.py beside this file. It reads T623 and T622 through the
numberdb client; set NUMBERDB_API_KEY for a private draft. If T623-before.json
and T622-before.json are present, it uses those archived documents instead.
All arithmetic is exact. The script never writes to the website.
"""
import numberdb.sage as numberdb
from sage.rings.rational_field import QQ
from sage.rings.number_field.number_field import CyclotomicField
from sage.version import version
from pathlib import Path
import hashlib
import json
from generate import LensSpaceRho

root = Path(__file__).resolve().parent

def records(doc):
    block = doc['Numbers']
    if isinstance(block, list):
        return [(tuple(int(row['params'][n]) for n in ('p', 'q', 'u')), QQ(row['number'])) for row in block]
    return [((int(p), int(q), int(u)), QQ(value['number'] if isinstance(value, dict) else value))
            for p, qs in block.items() for q, us in qs.items() for u, value in us.items()]

fields = {}
def exact_cotangent_rho(p, q, u):
    if p not in fields:
        fields[p] = CyclotomicField(p)
    field = fields[p]
    z = field.gen()
    total = field(0)
    for j in range(1, p):
        a, b, c = z**j, z**(q*j), z**(u*j)
        denominator = (a-1)*(b-1)
        assert denominator != 0
        total += (a+1)*(b+1)*(2-c-1/c)/denominator
    return QQ(-total/(2*p))

controls = [(2,1,1,'0'),(3,1,1,'1/3'),(3,2,1,'-1/3'),(4,1,2,'1'),(7,2,0,'0')]
for p,q,u,value in controls:
    assert exact_cotangent_rho(p,q,u) == QQ(value)

def document(tid):
    snapshot = root/(tid+'-before.json')
    return json.loads(snapshot.read_text()) if snapshot.exists() else numberdb.table(tid)

rho_doc = document('T623')
eta_doc = document('T622')
rhos = records(rho_doc)
etas = dict(records(eta_doc))
gen = LensSpaceRho()
assert [key for key, value in rhos] == [tuple(int(row[n]) for n in gen.parameters) for row in gen.enumerate()]
results = []
for key, value in rhos:
    p, q, u = key
    difference = etas[key] - etas[p, q, 0]
    assert difference == value
    assert exact_cotangent_rho(*key) == value
    assert gen.value(dict(zip(gen.parameters,key)),100) == value
    results.append({'p':p,'q':q,'u':u,'rho':str(value),'eta_difference':str(difference),'exact_cyclotomic_match':True})

print(json.dumps({
    'table':'T623','sage_version':version,'skill_evidence':{'manifest':'agents/runs/20261030T103826Z-repair-skills/manifest.json',
    'local_sha256':'28ecbeeccb0c5e5d6eb541b5a5b0f88aec47b154374d909085116d34f5629199',
    'live_sha256':'28ecbeeccb0c5e5d6eb541b5a5b0f88aec47b154374d909085116d34f5629199'},
    'scope':'Repair verification only; no independent argument-review verdict.',
    'method':'Exact cyclotomic cotangent sum, live T622 eta differences, and unchanged generator comparison.',
    'precision':'Exact rationals; no approximate argument or rounding uncertainty.',
    'controls':controls,'checked_rows':len(results),'all_passed':True,'results':results,
    'input_sha256':{name:hashlib.sha256((root/name).read_bytes()).hexdigest() for name in ('T623-before.json','T622-before.json','generate.py','repair_check.py','skill-evidence.json') if (root/name).exists()}
},indent=2))
