#!/bin/bash
set -euo pipefail

if [[ "${1-}" != '--preflight' || $# -ne 1 ]]; then
    printf 'DENIED: --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_dm_base=/home/dmdba/dmdbms/drivers/php_pdo/libphp74_dm.so
cdx_dm_pdo=/home/dmdba/dmdbms/drivers/php_pdo/php74_pdo_dm.so
if [[ "$(readlink -f "/proc/$cdx_pid/exe")" != "$cdx_php"
    || ! -r "/proc/$cdx_pid/environ" || ! -f "$cdx_ini"
    || ! -f "$cdx_dm_base" || ! -f "$cdx_dm_pdo" ]]; then
    printf 'HALT: fixed C runtime missing\n' >&2
    exit 3
fi

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"
if [[ -z "$cdx_ld" || -z "$cdx_svc" ]]; then
    printf 'HALT: C DM runtime library path missing\n' >&2
    exit 3
fi

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_dm_base" -d "extension=$cdx_dm_pdo" -r '
    set_exception_handler(static function (Throwable $e): void {
        fwrite(STDERR, "C_DELIVERY_PREFLIGHT_FAILED " . get_class($e) . "\n");
        exit(3);
    });
    $env = [];
    foreach (explode("\0", (string) file_get_contents("/proc/53772/environ")) as $item) {
        $pair = explode("=", $item, 2);
        if (count($pair) === 2) $env[$pair[0]] = $pair[1];
    }
    if (($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"
        || !in_array("dm", PDO::getAvailableDrivers(), true)) {
        throw new RuntimeException("C identity mismatch");
    }
    $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 ($db->query("SELECT SYS_CONTEXT(\x27USERENV\x27,\x27CURRENT_SCHEMA\x27) FROM DUAL")
        ->fetchColumn() !== "AIZHCT_APP") {
        throw new RuntimeException("C effective schema mismatch");
    }
    $table = (int) $db->query("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=\x27YOSHOP_DELIVERY\x27")
        ->fetchColumn();
    $rule = (int) $db->query("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=\x27YOSHOP_DELIVERY_RULE\x27")
        ->fetchColumn();
    if ($table !== 1 || $rule !== 1) {
        echo json_encode(["schema" => "AIZHCT_APP", "tables_present" => false,
            "business_http" => 0, "business_dml" => 0]), "\n";
        exit(3);
    }
    $s = $db->query("SELECT COUNT(*),MIN(DELIVERY_ID),MAX(DELIVERY_ID)"
        . " FROM YOSHOP_DELIVERY WHERE STORE_ID=10001 AND IS_DELETE=0")
        ->fetch(PDO::FETCH_NUM);
    $feeCols = $db->query("SELECT COLUMN_NAME,DATA_TYPE,DATA_PRECISION,DATA_SCALE"
        . " FROM USER_TAB_COLUMNS WHERE TABLE_NAME=\x27YOSHOP_DELIVERY_RULE\x27"
        . " AND COLUMN_NAME IN (\x27FIRST_FEE\x27,\x27ADDITIONAL_FEE\x27)"
        . " ORDER BY COLUMN_NAME")->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode(["schema" => "AIZHCT_APP", "tables_present" => true,
        "active_rows" => (int) $s[0], "min_id" => $s[1] === null ? null : (int) $s[1],
        "max_id" => $s[2] === null ? null : (int) $s[2],
        "fee_columns" => $feeCols,
        "business_http" => 0, "business_dml" => 0]), "\n";
';
