#!/usr/bin/env python3
"""Eight actual Time/Set write paths; preserve original B1 evidence loss."""
import json
from pathlib import Path
import sys
import integrate_20261010 as tool
from integrate_20261011_batches40_42 import private_files, run, sha
from integrate_20261011_batches46_48 import item

BASE=tool.STORE+'parallel-store-nutrition-dictionary-write8-20261011/'
def verify():
    root=tool.ROOT/BASE/'private-evidence'
    for name,count,pin in [
        ('original-manifest.json',100,'e6d8f8286471fe47b22e20600cb679b6c2113bd7fbd07684102194b9eab7b9a7'),
        ('final-manifest.json',155,'aad998d5858f38554ba44376d1d9bbd94de7876cc3b36bedfcaa2733d26e7354'),
        ('final-manifest-v2.json',158,'92523b74e65d87bb0df1673e39bc9d42b3a37b79e4e97558b39b048415e53070'),
    ]:
        assert sha(root/name)==pin
        records=tool.load(BASE+'private-evidence/'+name);assert len(records)==count
        private_files(root,records)
        for n,r in records.items():assert (root/n).stat().st_size==r['bytes']
    final=json.loads(run(BASE,sys.executable,'verify-final.py','--verify-only'))
    assert final['assertions']==487 and final['mutation_rejections']==204 and final['HTTP']==28
    assert final['HTTP_by_lane']=={'B':15,'C':13} and final['unique_methods']==8
    assert final['B1']=='EVIDENCE_INCOMPLETE' and final['original_business_red']==[{'lane':'C','step':7},{'lane':'C','step':9}]
    assert final['API_INSERT']=={'B':3,'C':2} and final['UPDATE_statements']=={'B':11,'C':10}
    assert final['native_preserved']=={'B':{'INSERT':2,'UPDATE':11},'C':{'INSERT':2,'UPDATE':10}}
    assert sum(final['prepared_statements'].values())==212 and sum(final['oracle_SELECT_queries'].values())==589
    assert final['physical_DELETE']==final['DDL']==final['CLI_prepare_DML']==0
    assert final['mutation_categories']['allowed_column_wrong_value']==final['mutation_categories']['allowed_column_wrong_native_type']==13
    source=tool.load(BASE+'private-evidence/source-sha.json');assert len(source)==14
    source.update({'p/logic/NutritionTime.php':'cd7efdf847ed2c4ee9acdc4504875fa51cc63e38dca167855660bb8a99bb47b3',
                   'p/logic/Nutrition.php':'42e491f372cd78ece0921fb1157364e9bad8dc321f75ba406550c32655f416b4'})
    for relative,digest in source.items():assert sha(tool.ROOT.parent/'zhctproject/store/application'/relative)==digest,relative
    for lane,port,pid in [('B',18831,10001),('C',18832,112175)]:
        c=tool.load(BASE+f'private-evidence/{lane}-execution/private-cleanup-write.json')
        assert c['passed'] and c['raw_evidence_SHA_unchanged'] and c['original_parent_still_alive']
        assert c['own_port']==port and c['original_parent_PID']==pid and c['natural_or_marked_DB_cleanup_DML']==0
    for name in ['original-manifest.json','final-manifest.json','final-manifest-v2.json']:
        private_files(root,tool.load(BASE+'private-evidence/'+name))

def targets():
    result=[];_,rows,_=tool.read_csv(tool.COVERAGE)
    for group in ['time','set']:
        for action in ['add','update','able','delete']:
            path=f'/p/nutrition_{group}/{action}'
            target=item('store','POST',path,BASE,runtime_observed_method='POST',
                runtime_inventory_scope='controller-direct-http-observed',runtime_direct_http_proof=BASE+'REPORT.md',
                runtime_controller_source=f'application/p/controller/Nutrition{group.title()}.php actual POST with current PC wrapper in PROPOSAL',
                terminal='PC端',risk='owned-Time-Set-CRUD-with-reference-rejection-and-no-external-effects',
                parity='partial-full-envelope-and-independent-nine-ten-column-native-bind-typed-effect-proof-original-B1-evidence-incomplete-extra-B-add-separate',
                boundary_empty_min_max='partial-reference-delete-rejected-repeat-status-original-error-and-form-typed-input-no-all-invalid-input-or-concurrency-proof',
                duplicate_retry='partial-repeat-status0-atomic-DM-noop-rowCount0-and-original-MySQL-body-identical',
                cleanup='retained-marked-five-softdeleted-Time-Set-rows-natural-protected-source-identical-workers-and-Auth-removed')
            matches=[r for r in rows if r['repo'] in ['store','unreviewed'] and tool.norm(r['route_or_command'])==tool.norm(path) and r['method'] in ['POST','*']]
            if not matches:target['register_new_runtime_key']=True
            else:
                assert all(r['repo']=='unreviewed' for r in matches) and len({r['source'] for r in matches})==1
                target.update(from_repo='unreviewed',from_source=matches[0]['source'])
            result.append(target)
    return result

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