<?php
declare(strict_types=1);

// C-only Store business schema preflight. SELECT metadata and relation IDs only.
set_exception_handler(static function (Throwable $error): void {
    echo json_encode(['status' => 'preflight-error',
        'class' => get_class($error), 'code' => (string)$error->getCode()],
        JSON_UNESCAPED_SLASHES), PHP_EOL;
    exit(2);
});
$raw = file_get_contents('/proc/53772/environ');
if ($raw === false) throw new RuntimeException('Approved C POC process unavailable');
$env = [];
foreach (explode("\0", $raw) as $part) {
    if (strpos($part, 'POC_') !== 0) continue;
    $position = strpos($part, '=');
    if ($position !== false) $env[substr($part, 0, $position)] = substr($part, $position + 1);
}
if (($env['POC_DIALECT'] ?? '') !== 'dm'
    || ($env['POC_EXTERNAL_STUBS'] ?? '') !== '1'
    || ($env['POC_HOST'] ?? '') !== '127.0.0.1'
    || ($env['POC_PORT'] ?? '') !== '5237'
    || ($env['POC_SCHEMA'] ?? '') !== 'ZHCT_APP'
    || ($env['POC_AI_PORT'] ?? '') !== '5238'
    || ($env['POC_AI_SCHEMA'] ?? '') !== 'AIZHCT_APP'
    || empty($env['POC_USER']) || empty($env['POC_PASSWORD'])) {
    throw new RuntimeException('C Store/AI source boundary mismatch');
}
$cmdline = file_get_contents('/proc/53772/cmdline');
if ($cmdline === false
    || strpos($cmdline, '/tmp/zhct-ai-http-20260929.3XDj3w/public') === false
    || strpos($cmdline, '127.0.0.1:18102') === false) {
    throw new RuntimeException('C isolated HTTP process mismatch');
}

$pdo = new PDO('dm:host=127.0.0.1;port=5237;schema=ZHCT_APP',
    $env['POC_USER'], $env['POC_PASSWORD'], [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_CASE => PDO::CASE_LOWER,
    ]);
$owner = strtoupper((string)$pdo->query('SELECT USER FROM DUAL')->fetchColumn());
$schema = strtoupper((string)$pdo->query(
    "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL"
)->fetchColumn());
if ($owner !== 'ZHCT_APP' || $schema !== 'ZHCT_APP') {
    throw new RuntimeException('C Store owner or schema mismatch');
}
$required = [
    'YDY_RESTAURANT_AREA' => ['ID', 'IS_DELETE', 'STATUS'],
    'YDY_RESTAURANT_SHOP' => ['ID', 'AREA_ID', 'IS_DELETE', 'STATUS'],
    'YDY_RESTAURANTS' => [
        'ID', 'RESTAURANT_SHOP_ID', 'IS_DELETE', 'STATUS', 'STALL_TYPE',
    ],
    'YDY_CONFIG' => ['CONFIG_KEY', 'CONFIG_VALUE'],
];
$tables = [];
$columns = [];
$tableStmt = $pdo->prepare('SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=?');
$columnStmt = $pdo->prepare(
    'SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME=?');
foreach ($required as $table => $needed) {
    $tableStmt->execute([$table]);
    $tables[$table] = (int)$tableStmt->fetchColumn() === 1;
    $columnStmt->execute([$table]);
    $found = array_map('strtoupper', $columnStmt->fetchAll(PDO::FETCH_COLUMN));
    $columns[$table] = count(array_diff($needed, $found)) === 0;
}
if (in_array(false, $tables, true) || in_array(false, $columns, true)) {
    echo json_encode(['status' => 'schema-blocked',
        'owner_schema_match' => true, 'tables' => $tables,
        'required_columns' => $columns], JSON_UNESCAPED_SLASHES), PHP_EOL;
    exit(3);
}

$configStmt = $pdo->query(
    "SELECT COUNT(*) FROM YDY_CONFIG WHERE CONFIG_KEY IN "
    . "('ossDisjunctor','ossHost','businessIdentify')");
$configCount = (int)$configStmt->fetchColumn();
$sql = 'SELECT a.ID AS AREA_ID, s.ID AS SHOP_ID, r.ID AS RESTAURANT_ID '
    . 'FROM YDY_RESTAURANT_AREA a '
    . 'JOIN YDY_RESTAURANT_SHOP s ON s.AREA_ID=a.ID '
    . 'JOIN YDY_RESTAURANTS r ON r.RESTAURANT_SHOP_ID=s.ID '
    . 'WHERE a.IS_DELETE=0 AND a.STATUS=1 '
    . 'AND s.IS_DELETE=0 AND s.STATUS=1 '
    . 'AND r.IS_DELETE=2 AND r.STATUS=1 AND r.STALL_TYPE IN (2,3) '
    . 'ORDER BY a.ID,s.ID,r.ID';
$row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
if (!is_array($row)) {
    echo json_encode(['status' => 'no-active-related-chain',
        'owner_schema_match' => true, 'tables' => $tables,
        'required_columns' => $columns,
        'oss_config_key_count' => $configCount], JSON_UNESCAPED_SLASHES), PHP_EOL;
    exit(3);
}
$areaId = (int)$row['area_id'];
$shopId = (int)$row['shop_id'];
$restaurantId = (int)$row['restaurant_id'];
$countStmt = $pdo->prepare(
    'SELECT COUNT(*) FROM YDY_RESTAURANTS WHERE RESTAURANT_SHOP_ID=? '
    . 'AND IS_DELETE=2 AND STATUS=1 AND STALL_TYPE IN (2,3)');
$countStmt->execute([$shopId]);
$stallCount = (int)$countStmt->fetchColumn();
echo json_encode(['status' => 'candidate-ready',
    'owner_schema_match' => true, 'tables' => $tables,
    'required_columns' => $columns,
    'oss_config_key_count' => $configCount,
    'area_id' => $areaId, 'shop_id' => $shopId,
    'restaurant_id' => $restaurantId, 'shop_active_order_stall_count' => $stallCount],
    JSON_UNESCAPED_SLASHES), PHP_EOL;
exit($areaId > 0 && $shopId > 0 && $restaurantId > 0 && $stallCount > 0 ? 0 : 3);
