<?php

declare(strict_types=1);

set_exception_handler(static function (Throwable $error): void {
    $info = $error instanceof PDOException ? $error->errorInfo : [];
    fwrite(STDERR, 'N4_DISH_C_READ_FAILED ' . get_class($error)
        . ' code=' . (string)($info[0] ?? $error->getCode()) . PHP_EOL);
    exit(2);
});
$env = [];
foreach (explode("\0", (string)@file_get_contents('/proc/53772/environ')) as $item) {
    $parts = explode('=', $item, 2);
    if (count($parts) === 2) $env[$parts[0]] = $parts[1];
}
if (($env['POC_TARGET_ROOT'] ?? '') !== '/tmp/zhct-ai-http-20260929.3XDj3w'
    || ($env['POC_BASE_URL'] ?? '') !== 'http://127.0.0.1:18102'
    || ($env['POC_DIALECT'] ?? '') !== 'dm'
    || ($env['POC_AI_HOST'] ?? '') !== '127.0.0.1'
    || ($env['POC_AI_PORT'] ?? '') !== '5238'
    || ($env['POC_AI_SCHEMA'] ?? '') !== 'AIZHCT_APP'
    || ($env['POC_AI_USER'] ?? '') !== 'AIZHCT_APP') {
    throw new RuntimeException('Unapproved C AI boundary');
}
$db = new PDO('dm:host=127.0.0.1;port=5238;schema=AIZHCT_APP',
    $env['POC_AI_USER'], $env['POC_AI_PASSWORD'],
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_CASE => PDO::CASE_LOWER]);
if ((string)$db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")
    ->fetchColumn() !== 'AIZHCT_APP') {
    throw new RuntimeException('C actual schema mismatch');
}
$hasColumn = static function (string $table, string $column) use ($db): bool {
    $stmt = $db->prepare('SELECT COUNT(*) FROM USER_TAB_COLUMNS'
        . ' WHERE TABLE_NAME=? AND COLUMN_NAME=?');
    $stmt->execute([$table, $column]);
    return (int)$stmt->fetchColumn() === 1;
};
$storeColumns = [
    'dishes_foods' => $hasColumn('YOSHOP_DISHES_FOODS', 'STORE_ID'),
    'foods' => $hasColumn('YOSHOP_FOODS', 'STORE_ID'),
];
$joinStore = $storeColumns['dishes_foods']
    ? ' AND df.STORE_ID=10001' : '';
$foodStore = $storeColumns['foods'] ? ' AND f.STORE_ID=10001' : '';
$sql = 'SELECT d.ID,MIN(df.ID) REL_ID,MIN(f.ID) FOOD_ID'
    . ' FROM YOSHOP_DISHES d'
    . ' JOIN YOSHOP_DISHES_FOODS df ON df.DISHES_ID=d.ID' . $joinStore
    . ' JOIN YOSHOP_FOODS f ON f.ID=df.FOODS_ID' . $foodStore
    . ' JOIN YOSHOP_DISHES_CATE c ON c.ID=d.CATEGORY AND c.PID=0'
    . ' WHERE d.STORE_ID=10001 AND d.IS_DELETE=0 AND d.WEIGHT>0 AND d.ENERGY>0'
    . ' AND d.CARBOHYDRATE>0 AND d.PROTEIN>0 AND d.FAT>0'
    . ' AND d.RAW_FLAG=2 AND df.FOODS_WEIGHT>0 AND df.SSB>0'
    . ' AND df.EDIBLE_PART>0 AND f.GI>0'
    . ' AND (SELECT COUNT(*) FROM YOSHOP_DISHES_FOODS allr'
    . ' WHERE allr.DISHES_ID=d.ID AND allr.STORE_ID=10001)=1'
    . ' GROUP BY d.ID HAVING COUNT(*)=1 ORDER BY d.ID ASC'
    . ' FETCH FIRST 1 ROWS ONLY';
$candidate = $db->query($sql)->fetch(PDO::FETCH_ASSOC) ?: null;
$hashes = [];
$ids = [];
if (is_array($candidate)) {
    foreach (['dishes' => ['YOSHOP_DISHES', (int)$candidate['id']],
        'relation' => ['YOSHOP_DISHES_FOODS', (int)$candidate['rel_id']],
        'food' => ['YOSHOP_FOODS', (int)$candidate['food_id']]] as $key => [$table, $id]) {
        $stmt = $db->prepare('SELECT * FROM ' . $table . ' WHERE ID=?');
        $stmt->execute([$id]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
        if (!is_array($row)) throw new RuntimeException('Candidate relation disappeared');
        ksort($row);
        $encoded = json_encode($row, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        if (!is_string($encoded)) throw new RuntimeException('Candidate hash failed');
        $hashes[$key] = hash('sha256', $encoded);
        $ids[$key] = $id;
    }
}
echo json_encode(['mode' => 'C-read-only-existing-dish-candidate',
    'store_columns_present' => $storeColumns,
    'single_relation_candidate_found' => $candidate !== null,
    'candidate_ids' => $ids, 'row_sha256' => $hashes],
    JSON_UNESCAPED_SLASHES) . PHP_EOL;
