<?php

declare(strict_types=1);

// C only. Metadata and COUNT(*), never SELECT a business or configuration value.
set_exception_handler(static function (Throwable $error): void {
    fwrite(STDERR, 'AI_STORE_NUTRITION_PREFLIGHT_FAILED '
        . get_class($error) . PHP_EOL);
    exit(2);
});
$pid = 53772;
$env = [];
foreach (explode("\0", (string)@file_get_contents('/proc/' . $pid . '/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('C non-production AI boundary mismatch');
}
$db = new PDO('dm:host=' . $env['POC_AI_HOST'] . ';port=' . $env['POC_AI_PORT']
    . ';schema=' . $env['POC_AI_SCHEMA'], $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 effective schema mismatch');
}
$count = static function (string $sql, array $args = []) use ($db): int {
    $stmt = $db->prepare($sql);
    $stmt->execute($args);
    return (int)$stmt->fetchColumn();
};
$requirements = [
    'store' => ['STORE_ID'],
    'store_user' => ['STORE_USER_ID', 'USER_NAME', 'IS_SUPER', 'STORE_ID'],
    'store_api' => ['API_ID', 'URL'],
    'store_menu_api' => ['API_ID', 'MENU_ID'],
    'store_user_role' => ['STORE_USER_ID'],
    'store_role_menu' => ['ROLE_ID', 'MENU_ID'],
    'staff' => ['ID', 'NAME', 'STORE_ID', 'IS_DELETE'],
    'staff_weight' => ['ID', 'STAFF_ID', 'SET_DATE', 'WEIGHT'],
    'habit' => ['ID', 'STAFF_ID', 'HABIT'],
    'habit_rpe' => ['ID', 'STAFF_ID', 'TRAIN_DATE'],
    'habit_rpe_info' => ['ID', 'RPE_ID'],
    'health' => ['ID', 'STAFF_ID', 'HEALTH'],
    'nurtition_target' => ['ID', 'STAFF_ID', 'SET_DATE', 'RECOMMEND_ENERGY'],
    'meal' => ['ID', 'STAFF_ID', 'MEAL_DATE'],
    'meal_infos' => ['ID', 'STAFF_ID', 'MEAL_DATE', 'DISHES_ID'],
    'dishes' => ['ID', 'NAME', 'STORE_ID'],
    'foods' => ['ID', 'NAME', 'STORE_ID'],
    'dishes_foods' => ['ID', 'DISHES_ID', 'FOODS_ID'],
    'dishes_cate' => ['ID', 'PID'],
    'upload_file' => ['FILE_ID'],
    'config_enum' => ['ID', 'ENUM_TYPE', 'IS_DELETE'],
    'meal_recommend' => ['ID', 'STAFF_ID', 'MEAL_DATE'],
];
$tables = [];
foreach ($requirements as $short => $columns) {
    $name = 'YOSHOP_' . strtoupper($short);
    $exists = $count('SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=?', [$name]) === 1;
    $columnPresent = false;
    if ($exists) {
        $stmt = $db->prepare('SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME=?');
        $stmt->execute([$name]);
        $found = array_map('strtoupper', $stmt->fetchAll(PDO::FETCH_COLUMN));
        $columnPresent = count(array_diff($columns, $found)) === 0;
    }
    $tables[$short] = ['table' => $exists, 'columns' => $columnPresent];
}
$readiness = ['store_10001' => null, 'habit_enum2_count' => null,
    'health_enum5_count' => null, 'dishes_cate_top_count' => null];
if ($tables['store']['columns']) {
    $readiness['store_10001'] = $count('SELECT COUNT(*) FROM YOSHOP_STORE WHERE STORE_ID=?', [10001]);
}
if ($tables['config_enum']['columns']) {
    $readiness['habit_enum2_count'] = $count('SELECT COUNT(*) FROM YOSHOP_CONFIG_ENUM'
        . ' WHERE ENUM_TYPE=? AND IS_DELETE=0', ['2']);
    $readiness['health_enum5_count'] = $count('SELECT COUNT(*) FROM YOSHOP_CONFIG_ENUM'
        . ' WHERE ENUM_TYPE=? AND IS_DELETE=0', ['5']);
}
if ($tables['dishes_cate']['columns']) {
    $readiness['dishes_cate_top_count'] = $count('SELECT COUNT(*) FROM YOSHOP_DISHES_CATE'
        . ' WHERE PID=0');
}
$routes = [
    'weight.staff_weight/list',
    'weight.staff_weight/echartsList',
    'store.habit/detail',
    'store.habit/dateRpe',
    'store.habit/detailRpe',
    'store.health/detail',
    'nutrition.nutrition_target/getFlagDate',
    'nutrition.nutrition_target/detail',
    'meal.meals/mealsInfo',
    'meal.meals/countListsValue',
    'dishes.dishes/dishLibrary',
];
$acl = [];
if ($tables['store_api']['columns'] && $tables['store_menu_api']['columns']) {
    foreach ($routes as $route) {
        $url = '/' . $route;
        $acl[$route] = [
            'api_rows' => $count('SELECT COUNT(*) FROM YOSHOP_STORE_API WHERE URL=?', [$url]),
            'menu_links' => $count('SELECT COUNT(*) FROM YOSHOP_STORE_MENU_API m'
                . ' JOIN YOSHOP_STORE_API a ON a.API_ID=m.API_ID WHERE a.URL=?', [$url]),
        ];
    }
}
$marker = 'CDXPARNU' . strtoupper(bin2hex(random_bytes(4)));
$markerZero = [];
foreach (['store_user' => 'USER_NAME', 'staff' => 'NAME', 'dishes' => 'NAME'] as $short => $field) {
    if (!$tables[$short]['columns']) {
        $markerZero[$short] = null;
        continue;
    }
    $markerZero[$short] = $count('SELECT COUNT(*) FROM YOSHOP_'
        . strtoupper($short) . ' WHERE ' . $field . '=?', [$marker]) === 0;
}
echo json_encode(['suite' => 'ai-store-nutrition-11-C',
    'mode' => 'read-only-metadata-counts', 'tables' => $tables,
    'readiness' => $readiness, 'acl' => $acl, 'fresh_marker_zero' => $markerZero],
    JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL;
