<?php

declare(strict_types=1);

// Independent process, SELECT only, exact synthetic marker from the manifest.
$lane=(string)getenv('CDX_AB_LANE');
$marker=(string)getenv('CDXPARBILL_MARKER');
if (!in_array($lane,['A','B'],true)
    || !preg_match('/^CDXPARBILL[A-F0-9]{8}$/',$marker)) {
    fwrite(STDERR,"Exact approved lane/marker required\n");
    exit(2);
}

try {
    $path='/tmp/zhct-store-ab-bill4-20261002/'
        .$lane.'-'.$marker.'.json';
    if (!is_file($path) || (fileperms($path)&0777)!==0600) {
        throw new RuntimeException('Private manifest boundary failed');
    }
    $manifest=json_decode((string)file_get_contents($path),true);
    if (!is_array($manifest) || ($manifest['lane']??'')!==$lane
        || ($manifest['marker']??'')!==$marker
        || ($manifest['permission_fixture_phase']??'')!=='cleaned') {
        throw new RuntimeException('Manifest cleanup state not proven');
    }
    $userUuid=(string)$manifest['user_uuid'];
    $roleUuid=(string)$manifest['role_uuid'];
    if (!preg_match('/^[a-fA-F0-9-]{36}$/',$userUuid)
        || !preg_match('/^[a-fA-F0-9-]{36}$/',$roleUuid)) {
        throw new RuntimeException('Synthetic UUID manifest invalid');
    }
    $root=$lane==='A'
        ? '/tmp/zhct-http-store-a.l5omH8'
        : '/tmp/zhct-http-store-mysql.dQTTBP';
    $pid=$lane==='A'?21023:10001;
    $port=$lane==='A'?18097:18081;
    $cmd=str_replace("\0",' ',(string)file_get_contents(
        '/proc/'.$pid.'/cmdline'));
    if (strpos($cmd,' -S 127.0.0.1:'.$port.' ')===false
        || strpos($cmd,$root.'/public')===false) {
        throw new RuntimeException('Wrong isolated HTTP runtime');
    }
    $load=static function(string $file): array { return require $file; };
    $config=$load('/workspace/zhct/zhctproject/store/application/config/local/database.php');
    $selected=$load($root.'/application/database.php');
    foreach (['hostname','database','username','password'] as $key) {
        if (!isset($config[$key],$selected[$key])
            || $config[$key]!==$selected[$key]) {
            throw new RuntimeException('Runtime not code-local MySQL');
        }
    }
    if (($selected['type']??null)!=='mysql'
        || (int)($config['hostport']??3306)
            !==(int)($selected['hostport']??3306)) {
        throw new RuntimeException('Wrong MySQL dialect/port');
    }
    $db=new PDO('mysql:host='.$config['hostname'].';port='.
        (int)($config['hostport']??3306).';dbname='.$config['database']
        .';charset=utf8mb4',(string)$config['username'],
        (string)$config['password'],[
            PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES=>false,
            PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,
            PDO::ATTR_TIMEOUT=>8,
        ]);
    if (strpos((string)$db->query('SELECT VERSION()')->fetchColumn(),'5.6.')===false) {
        throw new RuntimeException('Not code-local MySQL5.6');
    }
    $checks=[
        'user_account'=>['SELECT COUNT(*) FROM ydy_user WHERE account=?',[$marker]],
        'user_uuid'=>['SELECT COUNT(*) FROM ydy_user WHERE uuid=?',[$userUuid]],
        'role_name'=>['SELECT COUNT(*) FROM ydy_role WHERE name=?',[$marker]],
        'role_uuid'=>['SELECT COUNT(*) FROM ydy_role WHERE uuid=?',[$roleUuid]],
        'user_role_uuid'=>['SELECT COUNT(*) FROM ydy_user_role WHERE user_uuid=?',[$userUuid]],
        'role_menu_uuid'=>['SELECT COUNT(*) FROM ydy_role_menu WHERE role_uuid=?',[$roleUuid]],
        'user_data_uuid'=>['SELECT COUNT(*) FROM ydy_user_data WHERE user_uuid=?',[$userUuid]],
        'user_role_marker'=>['SELECT COUNT(*) FROM ydy_user_role WHERE create_by=?',[$marker]],
        'role_menu_marker'=>['SELECT COUNT(*) FROM ydy_role_menu WHERE create_by=?',[$marker]],
    ];
    $counts=[];
    foreach ($checks as $key=>[$sql,$args]) {
        $stmt=$db->prepare($sql);
        $stmt->execute($args);
        $counts[$key]=(int)$stmt->fetchColumn();
    }
    echo json_encode(['lane'=>$lane,'marker'=>$marker,
        'manifest_cleaned'=>true,'counts'=>$counts,
        'all_zero'=>array_sum($counts)===0],
        JSON_UNESCAPED_SLASHES).PHP_EOL;
    if (array_sum($counts)!==0) exit(1);
} catch (Throwable $error) {
    echo json_encode(['status'=>'blocked','class'=>get_class($error),
        'code'=>(string)$error->getCode()]).PHP_EOL;
    exit(1);
}
