#!/usr/bin/env python3
"""Enrich existing mUpdate/info with actual new finite plain-FLOAT write proof."""
import json
from pathlib import Path
import subprocess
import integrate_20261010 as tool
from integrate_20261011_batches40_42 import sha
from integrate_20261011_batches46_48 import item

BASE=tool.STORE+'parallel-store-nutrition-plain-float-weight-20261011/'
FINAL=BASE+'candidate-phase/'
def entries(root,name,pin,count):
    assert sha(root/name)==pin
    manifest=json.loads((root/name).read_text());assert len(manifest['entries'])==count
    for relative,record in manifest['entries'].items():
        r=Path(relative);assert not r.is_absolute() and '..' not in r.parts
        path=root/r;assert path.is_file() and not path.is_symlink()
        assert path.stat().st_size==record['bytes'] and sha(path)==record['sha256']
        assert format(path.stat().st_mode & 0o777,'o')==record['mode']
        if record['mode']=='600':
            parent=path.parent
            while parent!=root:
                assert not parent.is_symlink() and parent.stat().st_mode & 0o777==0o700
                parent=parent.parent
    return manifest

def verify():
    root=tool.ROOT/BASE;final=tool.ROOT/FINAL
    old=entries(root,'manifest-final.json','b0ef697181709b7c225b0ed9acf83f2d040e08b3ffbd5d152e0577f44eded2ef',92)
    assert sha(root/'manifest-original.json')=='277c06e4d2bb395142bd767d8348d1602566439a8e195e3062be24965a4a541e'
    entries(root/'portable','manifest.json','af7331c5ebcf447403338badfb366db3d6e113bd4ca1c2559e055e579e1a8bcc',3)
    entries(root/'md-audit','manifest.json','6828c3c43dabde55924561a443e9c0c3570dcb35f2790a2cc406ee7c0c956341',13)
    manifest=entries(final,'manifest.json','f349a27f38ab027c4b46b9f815d1e72c5f82d94a4324161b419b1ce7a73458d7',91)
    assert manifest['HTTP']==8 and manifest['business_UPDATE']==4
    assert manifest['other_DML']==manifest['DDL']==manifest['SDK']==0
    assert manifest['private_files']==57 and manifest['public_files']==34
    outputs=[]
    for script in ['verify-candidate.mjs','verify-dependencies.mjs']:
        p=subprocess.run(['node',str(final/script)],capture_output=True,text=True)
        assert p.returncode==0,p.stderr
        outputs.append(json.loads(p.stdout))
    response,deps=outputs
    assert response['assertions']==1486 and len(response['rejected_mutations'])==14
    assert response['MySQL_complete_DTO_controls']==response['MySQL_original_SQL_controls']==2
    assert deps['assertions']==896 and deps['total_recorded_entries']==730 and deps['all_asserted_equal']
    assert deps['actual_extend_files']==[]
    sources=json.loads((final/'source-lock.json').read_text());assert len(sources)==959
    assert sha(final/'source-lock.json')=='49b1a564de5a93dcd0385659a3d79f2e92256970b7fd7cc0a1adb8d482ccdd57'
    for relative,digest in sources.items():
        assert sha(tool.ROOT.parent/'zhctproject/store/application'/relative)==digest,relative
    for relative,record in manifest['entries'].items():assert sha(final/relative)==record['sha256']

def targets():
    return [item('store','POST',path,FINAL,evidence_only=True,
        risk='actual-two-new-positive-finite-plain-FLOAT-edits-only-exact-thirteen-SET-own-UUID',
        parity='partial-8-real-HTTP-computed-promoted32-bits-and-physical-info-six-significant-getters-equal-two-complete-DTO-pairs',
        boundary_empty_min_max='partial-positive-finite-12.346-and-123.4568-not-unsupported-scalars-negative-zero-capacity-or-all-inputs',
        cleanup='marked-final-weight-retained-own-workers-ports-Auth-cache-cleared-source959-and-730-includes-proven')
        for path in ['/m/nutrition/update','/m/nutrition/info']]

if __name__=='__main__':
    audit=Path(__file__).with_name('integration-20261011-batch76.json')
    assert not audit.exists(),'Preserve original transition audit'
    tool.main(targets(),audit,verify)
