#!/usr/bin/env python3
"""One-time archive/page evidence integration; metadata-only stays limited."""
import hashlib
import json
from pathlib import Path
import subprocess
import sys
import integrate_20261010 as tool

PAPER=tool.STORE+'parallel-store-paper-match-crud-20261010/'
PAGE=tool.AI+'parallel-ai-page-config-20261010/'

def run(relative):
    return subprocess.run([sys.executable,str(tool.ROOT/relative)],check=True,capture_output=True,text=True)

def sha(relative,expected):
    assert hashlib.sha256((tool.ROOT.parent/relative).read_bytes()).hexdigest()==expected

def verify_paper():
    r=json.loads(run(PAPER+'compare.py').stdout)
    assert r['passed'] and r['check_count']==42 and all(r['checks'].values())
    sha('zhctproject/store/application/p/logic/Treatise.php','8f2441c32545a194f724baa6a3ec7a6276c1f2a32f8a2731c4f8b0a1e88b7142')
    sha('zhctproject/store/application/p/logic/MatchRecord.php','a2e7eca1f5ed758066cc646850b9b3b89ddf3de4f24b59dd7fb0161ec6945b25')
    r=tool.load(PAPER+'resource-cleanup.json')
    for lane in ['B','C']:
        assert r[lane]['worker_absent'] and r[lane]['port_closed'] and r[lane]['own_archive_rows']==0
    assert r['token_cache_raw_CLI_reports_private_variables_and_copied_configs_removed']
    assert r['unrelated_natural_data_deleted_or_rolled_back']==0

def verify_page():
    r=json.loads(run(PAGE+'compare.py').stdout)
    assert r['status']=='PASS' and r['differences']==[]
    assert r['actual_native_HTTP_total']==68 and r['named_native_assertions_total']==332
    assert len(r['defaultData_metadata_only_no_business_row'])==4
    run(PAGE+'test_compare.py')
    sha('zhctproject/ai_api/app/common/database/DmBuilder.php','58e1e79ce69881cc305c6fd33adec0e9a3d030ac15b4c00ae464cbaa4cce2b59')
    for lane in ['B','C']:
        r=tool.load(PAGE+'resource-cleanup-'+lane+'.json')
        assert r['tokens_removed'] and r['business_cache_files']==0 and r['raw_token_CLI_reports_removed']
        assert r['port_closed'] and r['database_rows_retained']==4

def target(repo,method,path,evidence,scope,**extra):
    return dict(repo=repo,method=method,path=path,module='数据库兼容有界验收',terminal='PC-or-terminal-see-report',
        role='approved-private-normal-auth-context',risk='owned-archive-or-page-config',scope=scope,
        evidence=evidence+'REPORT.md',**extra)

def specs():
    paper=[target('store','POST',f'/p/{module}/{action}',PAPER,
        'store-primary-owned-two-archive-tables-consumed-actor-staff-user-readonly-background-unknown',
        parity='partial-evidence-source-complete-projection-and-wire-unchanged-DM-create-by32-time-format-fixed',
        request_type='current-controller-form',
        cleanup='formal-API-delete-owned-zero-original-two-tables-metadata-unchanged-private-resources-released',
        boundary_empty_min_max='partial-evidence-complete-CRUD-nonempty-quoted-Chinese-source-UUID-truncation-shared-original-message')
        for module in ['treatise','matchRecord'] for action in ['add','delete','info','lists','update']]
    page=[]
    for module in ['store','terminal']:
        for action in ['list','defaultData','detail','add','edit','delete','setHome']:
            x=target('ai_api','GET' if action in ['list','defaultData','detail'] else 'POST',
                f'/{module}/Page/{action}',PAGE,'ai-primary-owned-page-tenants-no-external-effects',
                parity='partial-evidence-complete-typed-JSON-30-flow-plus4-original-projection-pairs',
                request_type='GET-query' if action in ['list','defaultData','detail'] else 'current-PC-JSON-form',
                cleanup='retained-four-owned-softdeleted-nonhome-pages-natural-full-SHA-unchanged-private-resources-released',
                boundary_empty_min_max='partial-evidence-JSON-quote-Chinese-Boolean-null-array-order-tenant-read-isolation-home-delete-refusal')
            if action=='defaultData':
                x.update(scope='metadata-only-no-business-row',
                    mysql_state='partial-evidence-metadata-only-static-defaults',
                    dm_state='partial-evidence-metadata-only-static-defaults',
                    success_case='partial-evidence-metadata-and-static-default-payload-only-no-customer-row',
                    mysql_readback='partial-evidence-field-metadata-only-no-business-readback',
                    dm_readback='partial-evidence-field-metadata-only-no-business-readback',
                    readback='partial-evidence-metadata-only-no-business-row',
                    parity='partial-evidence-static-default-full-JSON-equal-metadata-SQL-observed-not-business-row')
            page.append(x)
    return [(31,paper,verify_paper),(32,page,verify_page)]

if __name__=='__main__':
    batches=specs()
    for n,_,verify in batches:
        assert not Path(__file__).with_name(f'integration-20261010-batch{n}.json').exists(),'Preserve original transition audit'
        verify()
    for n,items,verify in batches:
        tool.main(items,Path(__file__).with_name(f'integration-20261010-batch{n}.json'),verify)
