<?php
declare(strict_types=1);

// Separate-process read-only check for one exact synthetic unbind fixture.
set_exception_handler(static function (Throwable $error): void {
    echo json_encode(['status' => 'zero-check-error', 'class' => get_class($error),
        'code' => (string)$error->getCode(),
        'message_sha256' => hash('sha256', $error->getMessage())], JSON_UNESCAPED_SLASHES), PHP_EOL;
    exit(2);
});
$lane = (string)getenv('CDX_UNBIND_LANE');
$marker = (string)getenv('CDX_UNBIND_MARKER');
if (!in_array($lane, ['A', 'B', 'C'], true)
    || !preg_match('/^CDXUF[A-F0-9]{16}$/', $marker)) {
    throw new RuntimeException('Exact lane/marker required');
}
$journalDir = '/tmp/zhct-electronic-menu-unbind-fault-' . $lane;
$journal = $journalDir . '/' . $marker . '.json';
if (is_link($journalDir) || !is_dir($journalDir)
    || fileowner($journalDir) !== posix_geteuid()
    || (fileperms($journalDir) & 0777) !== 0700
    || is_link($journal) || !is_file($journal)
    || fileowner($journal) !== posix_geteuid()
    || (fileperms($journal) & 0777) !== 0600) {
    throw new RuntimeException('Private recovery journal missing or unsafe');
}
$record = json_decode((string)file_get_contents($journal), true);
if (!is_array($record) || ($record['lane'] ?? null) !== $lane
    || ($record['marker'] ?? null) !== $marker
    || (int)($record['actor_id'] ?? 0) < 1
    || (int)($record['menu_id'] ?? 0) < 1
    || (int)($record['device_record_id'] ?? 0) < 1
    || ($record['device_id'] ?? null) !== $marker . 'TV') {
    throw new RuntimeException('Journal does not identify exact owned rows');
}
if ($lane === 'C') {
    if (getenv('POC_HOST') !== '127.0.0.1' || getenv('POC_PORT') !== '5237'
        || getenv('POC_SCHEMA') !== 'ZHCT_APP' || getenv('POC_USER') !== 'ZHCT_APP') {
        throw new RuntimeException('Wrong C nonproduction DM identity');
    }
    $db = new PDO('dm:host=127.0.0.1;port=5237;schema=ZHCT_APP',
        getenv('POC_USER'), getenv('POC_PASSWORD'), [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    $schema = strtoupper((string)$db->query(
        "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn());
    $fingerprint = hash('sha256', 'ZHCT_APP|5237|' . $schema);
    $expected = 'bc98485aed26beab348770a82ae38dbf922b04ab88a210cd7282c4caf0156194';
    $prefix = 'YDY_';
} else {
    $local = require '/workspace/zhct/zhctproject/store/application/config/local/database.php';
    if (!is_array($local)) throw new RuntimeException('Code-local Store config unavailable');
    $db = new PDO('mysql:host=' . $local['hostname'] . ';port=' . (int)($local['hostport'] ?? 3306)
        . ';dbname=' . $local['database'] . ';charset=' . ($local['charset'] ?? 'utf8'),
        $local['username'], $local['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    $identity = (string)$db->query(
        "SELECT CONCAT(@@server_uuid,'|',@@hostname,'|',@@port,'|',DATABASE())"
    )->fetchColumn();
    $fingerprint = hash('sha256', $identity);
    $expected = '003eb5aecf1cd4595b609c1f7f20b9ee325b578309fb9fe14fedaf77584fa401';
    $prefix = 'ydy_';
}
if ($fingerprint !== $expected || ($record['db_fingerprint'] ?? null) !== $fingerprint) {
    throw new RuntimeException('Approved database/journal identity mismatch');
}
$queries = [
    'operator_marker' => ['SELECT COUNT(*) FROM ' . $prefix . 'user'
        . ' WHERE UUID=? OR ACCOUNT=?', [$marker, $marker]],
    'menu_marker' => ['SELECT COUNT(*) FROM ' . $prefix . 'electronic_menu'
        . ' WHERE CREATE_BY=?', [$marker]],
    'device_marker' => ['SELECT COUNT(*) FROM ' . $prefix . 'electronic_menu_device'
        . ' WHERE DEVICE_ID=? AND STORE_ID=10001', [$marker . 'TV']],
    'operator' => ['SELECT COUNT(*) FROM ' . $prefix . 'user'
        . ' WHERE ID=? AND UUID=? AND ACCOUNT=? AND TYPE=0 AND CREATE_BY=?',
        [(int)$record['actor_id'], $marker, $marker, 'CODEX']],
    'menu' => ['SELECT COUNT(*) FROM ' . $prefix . 'electronic_menu'
        . ' WHERE ID=? AND UUID=? AND CREATE_BY=? AND STORE_ID=10001',
        [(int)$record['menu_id'], (string)$record['menu_uuid'], $marker]],
    'device' => ['SELECT COUNT(*) FROM ' . $prefix . 'electronic_menu_device'
        . ' WHERE ID=? AND UUID=? AND DEVICE_ID=? AND MENU_ID=? AND STORE_ID=10001',
        [(int)$record['device_record_id'], (string)$record['device_uuid'],
            (string)$record['device_id'], (int)$record['menu_id']]],
    'bind_code' => ['SELECT COUNT(*) FROM ' . $prefix . 'electronic_menu_bind_code'
        . ' WHERE MENU_ID=?', [(int)$record['menu_id']]],
    'device_log' => ['SELECT COUNT(*) FROM ' . $prefix . 'electronic_menu_device_log'
        . ' WHERE MENU_ID=?', [(int)$record['menu_id']]],
];
$counts = [];
foreach ($queries as $name => [$sql, $params]) {
    $stmt = $db->prepare($sql);
    $stmt->execute($params);
    $counts[$name] = (int)$stmt->fetchColumn();
}
$pass = ($record['phase'] ?? null) === 'cleaned'
    && array_sum($counts) === 0;
echo json_encode(['status' => $pass ? 'independent-zero' : 'cleanup-unverified',
    'lane' => $lane, 'marker' => $marker, 'counts' => $counts,
    'journal_phase' => $record['phase'] ?? null,
    'database_fingerprint' => $fingerprint], JSON_UNESCAPED_SLASHES), PHP_EOL;
exit($pass ? 0 : 3);
