#!/bin/bash
set -euo pipefail
if [[ $# -ne 1 || "${1-}" != '--preflight' ]]; then
    printf 'DENIED: exact --preflight required\n' >&2
    exit 78
fi
cdx_pid=53772
cdx_php=/www/server/php/74/bin/php
cdx_ini=/www/server/php/74/etc/php-cli.ini
cdx_base=/home/dmdba/dmdbms/drivers/php_pdo/libphp74_dm.so
cdx_pdo=/home/dmdba/dmdbms/drivers/php_pdo/php74_pdo_dm.so
[[ "$(readlink -f "/proc/$cdx_pid/exe")" == "$cdx_php" ]]
cdx_ld=''
cdx_svc=''
while IFS= read -r -d '' cdx_entry; do
    case "$cdx_entry" in
        LD_LIBRARY_PATH=*) cdx_ld="${cdx_entry#LD_LIBRARY_PATH=}" ;;
        DM_SVC_PATH=*) cdx_svc="${cdx_entry#DM_SVC_PATH=}" ;;
    esac
done < "/proc/$cdx_pid/environ"
[[ -n "$cdx_ld" && -n "$cdx_svc" ]]
exec /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
    "LD_LIBRARY_PATH=$cdx_ld" "DM_SVC_PATH=$cdx_svc" \
    "$cdx_php" -c "$cdx_ini" -d "extension=$cdx_base" \
    -d "extension=$cdx_pdo" -r '
set_exception_handler(static function (Throwable $e): void {
    fwrite(STDERR, "C_SCHEMA_PREFLIGHT_FAILED " . get_class($e) . "\n");
    exit(3);
});
$e = [];
foreach (explode("\0", (string)file_get_contents("/proc/53772/environ")) as $v) {
    $pair = explode("=", $v, 2);
    if (count($pair) === 2) $e[$pair[0]] = $pair[1];
}
if (($e["POC_DIALECT"] ?? "") !== "dm"
    || ($e["POC_AI_HOST"] ?? "") !== "127.0.0.1"
    || ($e["POC_AI_PORT"] ?? "") !== "5238"
    || ($e["POC_AI_SCHEMA"] ?? "") !== "AIZHCT_APP"
    || ($e["POC_AI_USER"] ?? "") !== "AIZHCT_APP") {
    throw new RuntimeException("C source identity changed");
}
$d = new PDO("dm:host=127.0.0.1;port=5238;schema=AIZHCT_APP",
    $e["POC_AI_USER"], $e["POC_AI_PASSWORD"],
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_CASE => PDO::CASE_LOWER]);
if ($d->query("SELECT SYS_CONTEXT(\x27USERENV\x27,\x27CURRENT_SCHEMA\x27) FROM DUAL")
    ->fetchColumn() !== "AIZHCT_APP") {
    throw new RuntimeException("C schema mismatch");
}
$tables = ["YOSHOP_DELIVERY", "YOSHOP_DELIVERY_RULE"];
$out = [];
foreach ($tables as $t) {
    $s = $d->prepare("SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE,"
        . "NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID");
    $s->execute([$t]);
    $out[$t]["columns"] = $s->fetchAll(PDO::FETCH_ASSOC);
    $s = $d->prepare("SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS"
        . " FROM USER_CONSTRAINTS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME");
    $s->execute([$t]);
    $out[$t]["constraints"] = $s->fetchAll(PDO::FETCH_ASSOC);
    $s = $d->prepare("SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS WHERE TABLE_NAME=?");
    $s->execute([$t]);
    $out[$t]["triggers"] = $s->fetchAll(PDO::FETCH_ASSOC);
    if ($t === "YOSHOP_DELIVERY") {
        $out[$t]["active_rows"] = (int)$d->query("SELECT COUNT(*) FROM " . $t
            . " WHERE STORE_ID=10001 AND IS_DELETE=0")->fetchColumn();
    }
}
$regionPresent = (int)$d->query("SELECT COUNT(*) FROM YOSHOP_REGION WHERE ID=1")
    ->fetchColumn();
$goodsDeliveryColumn = (int)$d->query("SELECT COUNT(*) FROM USER_TAB_COLUMNS"
    . " WHERE TABLE_NAME=\x27YOSHOP_GOODS\x27 AND COLUMN_NAME=\x27DELIVERY_ID\x27")
    ->fetchColumn();
echo json_encode(["schema" => "AIZHCT_APP", "tables" => $out,
    "region_id_1_present" => $regionPresent === 1,
    "goods_delivery_id_present" => $goodsDeliveryColumn === 1,
    "business_http" => 0, "business_dml" => 0], JSON_UNESCAPED_SLASHES), "\n";
';
