"""Exact checks for the T673 editorial repair.

With generate.py, eta-data.json, before.json, related-2.json and standards.json
beside this script, run: sage -python repair_checks.py
The website generator and its source dependencies are not modified.
"""
import numberdb.sage as numberdb
from sage.rings.integer_ring import ZZ
import hashlib
import json
from pathlib import Path
from generate import ThompsonCoefficients
from sage.env import SAGE_VERSION

root = Path(__file__).resolve().parent
document = json.loads((root/'before.json').read_text())
degrees = json.loads((root/'related-2.json').read_text())['Numbers']['Th']
standards = json.loads((root/'standards.json').read_text())

def integer(value):
    return ZZ(value['number'] if isinstance(value, dict) else value)

generator = ThompsonCoefficients()
identities = [{'g':g,'n':str(n)} for g, grades in document['Numbers'].items() for n in grades]
assert list(generator.enumerate()) == identities
for params in identities:
    assert integer(generator.value(params,100)) == integer(document['Numbers'][params['g']][params['n']])

# These six decompositions come from Harvey--Rayhaun Table 2.
# Character degrees are read independently from the live companion table.
cases = [(0, [2], 1, 248), (4, [4,5], 1, 27000),
         (5, [9,10], -1, 85995), (8, [17,18], 1, 1707264),
         (9, [22,23], -1, 4096000), (12, [40,40], 1, 44330496)]
checked=[]
for grade, indices, sign, degree in cases:
    degree_values = [integer(degrees[str(i)]) for i in indices]
    assert all(d == degree for d in degree_values)
    expected = sign * sum(degree_values)
    stored = integer(document['Numbers']['1A'][str(grade)])
    assert stored == expected
    assert stored != expected + 1  # Deliberately perturbed control.
    checked.append({'grade':grade, 'character_indices':indices,
                    'degrees':list(map(str,degree_values)), 'sign':sign,
                    'stored':str(stored),'expected':str(expected)})
assert integer(generator.value({'g':'3A','n':'205'},100)) == ZZ(26523498870)
result={'table':'T673','checks_passed':True,'sage_version':SAGE_VERSION,
        'enumerated_and_recomputed':len(identities),'representation_identities':checked,
        'program_example':'26523498870','perturbed_controls_rejected':6,
        'method':'Exact Sage integers; all stored values recomputed by the unchanged generator; six representation identities checked against live character degrees and the cited primary source. This is repair verification, not a new independent critique.',
        'new_values':0,'argument_uncertainty':'None: conjugacy classes and integer grades are exact discrete indices.',
        'skill_manifest':standards['skill_manifest'], 'skill_manifest_sha256':standards['skill_manifest_sha256'],
        'skill_versions':standards['skill_versions'],
        'inputs_sha256':{name:hashlib.sha256((root/name).read_bytes()).hexdigest() for name in
                        ['before.json','related-2.json','generate.py','eta-data.json']}}
print(json.dumps(result,indent=2))
