<?php

declare(strict_types=1);

$lane = $argv[1] ?? '';
if (!in_array($lane, ['B', 'C'], true)) exit(2);
$originalPid = $lane === 'B' ? 10001 : 112175;
$originalRoot = $lane === 'B'
    ? '/tmp/zhct-http-store-mysql.dQTTBP'
    : '/tmp/zhct-dm-poc-20260928.fcpiiN/store';
$privateRoot = '/tmp/cdx-train-alias-20261012-' . $lane;
$port = $lane === 'B' ? 19121 : 19122;
if (strpos((string)file_get_contents('/proc/' . $originalPid . '/cmdline'), $originalRoot . '/public') === false
    || !is_file($privateRoot . '/application/p/controller/Payment.php')
    || !is_file($privateRoot . '/application/config/poc/config.php')
    || is_file($privateRoot . '/private-http.pid')) {
    throw new RuntimeException('Original or private runtime preflight failed');
}
$allowed = ['PATH', 'LANG', 'LC_ALL', 'LC_CTYPE', 'TZ', 'NLS_LANG', 'DM_CHARSET',
    'DM_SVC_PATH', 'DM_HOME', 'LD_LIBRARY_PATH', 'POC_HOST', 'POC_PORT',
    'POC_SCHEMA', 'POC_USER', 'POC_PASSWORD', 'POC_AI_HOST', 'POC_AI_PORT',
    'POC_AI_SCHEMA', 'POC_AI_USER', 'POC_AI_PASSWORD', 'POC_DIALECT',
    'POC_PREFIX', 'POC_CHARSET', 'POC_REDIS_HOST', 'POC_REDIS_PORT',
    'POC_EXTERNAL_STUBS'];
$env = [];
foreach (explode("\0", (string)file_get_contents('/proc/' . $originalPid . '/environ')) as $pair) {
    $parts = explode('=', $pair, 2);
    if (count($parts) === 2 && in_array($parts[0], $allowed, true)) $env[$parts[0]] = $parts[1];
}
if ($lane === 'B') {
    $privateConfig = require $privateRoot . '/application/database.php';
    $localConfig = require '/workspace/zhct/zhctproject/store/application/config/local/database.php';
    foreach (['hostname', 'hostport', 'database', 'username', 'password'] as $field) {
        $default = $field === 'hostport' ? '3306' : '';
        if ((string)($privateConfig[$field] ?? $default) !== (string)($localConfig[$field] ?? $default)
            || (string)($privateConfig['ai_zhct'][$field] ?? $default) !== (string)($localConfig['ai_zhct'][$field] ?? $default)) {
            throw new RuntimeException('B database differs from local development');
        }
    }
    $map = ['hostname' => 'HOST', 'hostport' => 'PORT', 'database' => 'SCHEMA',
        'username' => 'USER', 'password' => 'PASSWORD'];
    foreach ($map as $key => $suffix) {
        $env['POC_' . $suffix] = (string)$privateConfig[$key];
        $env['POC_AI_' . $suffix] = (string)$privateConfig['ai_zhct'][$key];
    }
    $env['POC_DIALECT'] = 'mysql';
}
if (($env['POC_EXTERNAL_STUBS'] ?? '') !== '1'
    || ($env['POC_DIALECT'] ?? '') !== ($lane === 'B' ? 'mysql' : 'dm')
    || count(array_intersect(['POC_HOST', 'POC_PORT', 'POC_SCHEMA', 'POC_USER', 'POC_PASSWORD',
        'POC_AI_HOST', 'POC_AI_PORT', 'POC_AI_SCHEMA', 'POC_AI_USER', 'POC_AI_PASSWORD'], array_keys($env))) !== 10) {
    throw new RuntimeException('Isolated DB scope unavailable');
}
$env['POC_REAL_QUEUE'] = '0';
$env['POC_APP_ROOT'] = $privateRoot;
$env['POC_BASE_URL'] = 'http://127.0.0.1:' . $port;
$php = $lane === 'B' ? '/usr/local/php7.3/bin/php' : '/www/server/php/73/bin/php';
$args = [$php];
if ($lane === 'C') array_push($args, '-c', '/www/server/php/73/etc/php-cli.ini',
    '-d', 'extension=/home/dmdba/dmdbms/drivers/php_pdo/libphp73_dm.so',
    '-d', 'extension=/home/dmdba/dmdbms/drivers/php_pdo/php73_pdo_dm.so');
array_push($args, '-d', 'display_errors=0', '-d', 'log_errors=1',
    '-S', '127.0.0.1:' . $port, '-t', $privateRoot . '/public',
    $privateRoot . '/public/' . ($lane === 'B' ? 'router.php' : 'index.php'));
$cmd = 'nohup ' . implode(' ', array_map('escapeshellarg', $args))
    . ' </dev/null >' . escapeshellarg($privateRoot . '/private-http.log') . ' 2>&1 & echo $!';
$proc = proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes, null, $env);
if (!is_resource($proc)) throw new RuntimeException('Could not launch private runtime');
$pid = (int)trim(stream_get_contents($pipes[1]));
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($proc);
if ($pid <= 1) throw new RuntimeException('Private runtime PID unavailable');
file_put_contents($privateRoot . '/private-http.pid', (string)$pid, LOCK_EX);
chmod($privateRoot . '/private-http.pid', 0600);
echo json_encode(['lane' => $lane, 'port' => $port, 'private_pid' => $pid,
    'source' => 'fresh application overlay, private runtime']) . PHP_EOL;
