<?php

declare(strict_types=1);

$dialect = (string)getenv('POC_DIALECT');
$marker = (string)getenv('POC_MARKER');
$aiId = (int)getenv('POC_AI_ID');
$storeUserId = (int)getenv('POC_STORE_USER_ID');
$staffId = (int)getenv('POC_STAFF_ID');
$orderId = (int)getenv('POC_ORDER_ID');
if (!in_array($dialect, ['mysql', 'dm'], true)
    || !preg_match('/^CDXPARMOB[A-F0-9]{8}$/', $marker)
    || min($aiId, $storeUserId, $staffId, $orderId) <= 0) {
    throw new RuntimeException('Explicit synthetic fixture identity required');
}
if ($dialect === 'mysql') {
    $local = parse_ini_file((string)getenv('POC_MYSQL_LOCAL_ENV'), true, INI_SCANNER_RAW);
    foreach (['DATABASE' => 'AI_', 'DATABASE_ZHCT' => ''] as $section => $prefix) {
        foreach (['HOSTNAME' => 'HOST', 'HOSTPORT' => 'PORT', 'DATABASE' => 'SCHEMA',
            'USERNAME' => 'USER', 'PASSWORD' => 'PASSWORD'] as $source => $target) {
            putenv('POC_' . $prefix . $target . '=' . (string)$local[$section][$source]);
        }
    }
}
$pdo = static function (string $prefix) use ($dialect): PDO {
    $host = getenv('POC_' . $prefix . 'HOST');
    $port = getenv('POC_' . $prefix . 'PORT');
    $schema = getenv('POC_' . $prefix . 'SCHEMA');
    $dsn = $dialect === 'dm' ? "dm:host=$host;port=$port;schema=$schema"
        : "mysql:host=$host;port=$port;dbname=$schema;charset=utf8mb4";
    return new PDO($dsn, getenv('POC_' . $prefix . 'USER'),
        getenv('POC_' . $prefix . 'PASSWORD'),
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
};
$a = $pdo('AI_');
$s = $pdo('');
$table = static function (string $name) use ($dialect): string {
    return $dialect === 'dm' ? strtoupper($name) : $name;
};
$aUser = $table('yoshop_user');
$aCart = $table('yoshop_meal_cart');
$aSettlement = $table('yoshop_account_settlement');
$aBalanceLog = $table('yoshop_user_balance_log');
$sStaff = $table('ydy_staff');
$sUser = $table('ydy_user');
$sOrder = $table('ydy_meal_order');
$sMenu = $table('ydy_initial_menu');
$sPickup = $table('ydy_meal_order_pickup');
$one = static function (PDO $db, string $sql, array $args): array {
    $q = $db->prepare($sql);
    $q->execute($args);
    return array_change_key_case((array)$q->fetch(PDO::FETCH_ASSOC));
};
$count = static function (PDO $db, string $sql, array $args): int {
    $q = $db->prepare($sql);
    $q->execute($args);
    return (int)$q->fetchColumn();
};
$a->beginTransaction();
$s->beginTransaction();
try {
    $ai = $one($a, "SELECT USER_ID,NICK_NAME,BALANCE FROM $aUser WHERE USER_ID=?", [$aiId]);
    $staff = $one($s, "SELECT ID,NAME,AI_USER_ID FROM $sStaff WHERE ID=?", [$staffId]);
    $user = $one($s, "SELECT ID,ACCOUNT,AI_USER_ID FROM $sUser WHERE ID=?", [$storeUserId]);
    $order = $one($s, "SELECT ID,USER_ID,REMARK,PAY_STATUS FROM $sOrder WHERE ID=?", [$orderId]);
    if (($ai['nick_name'] ?? null) !== $marker || (string)($ai['balance'] ?? '') !== '100.00'
        || ($staff['name'] ?? null) !== $marker || (int)($staff['ai_user_id'] ?? 0) !== $aiId
        || ($user['account'] ?? null) !== $marker || (int)($user['ai_user_id'] ?? 0) !== $aiId
        || (int)($order['user_id'] ?? 0) !== $storeUserId
        || ($order['remark'] ?? null) !== $marker || (int)($order['pay_status'] ?? 0) !== 10
        || $count($a, "SELECT COUNT(*) FROM $aSettlement WHERE USER_ID=?", [$aiId]) !== 0
        || $count($a, "SELECT COUNT(*) FROM $aBalanceLog WHERE USER_ID=?", [$aiId]) !== 0
        || $count($s, "SELECT COUNT(*) FROM $sPickup WHERE MEAL_ORDER_ID=?", [$orderId]) !== 0) {
        throw new RuntimeException('Fixture is not the expected unpaid, unspent synthetic order');
    }
    $delete = static function (PDO $db, string $sql, array $args): int {
        $q = $db->prepare($sql);
        $q->execute($args);
        return $q->rowCount();
    };
    $menu = $delete($s, "DELETE FROM $sMenu WHERE MEAL_ORDER_ID=?", [$orderId]);
    if ($delete($s, "DELETE FROM $sOrder WHERE ID=? AND USER_ID=? AND REMARK=? AND PAY_STATUS=10",
        [$orderId, $storeUserId, $marker]) !== 1) throw new RuntimeException('Order deletion not exact');
    $cart = $delete($a, "DELETE FROM $aCart WHERE USER_ID=?", [$aiId]);
    if ($delete($s, "DELETE FROM $sUser WHERE ID=? AND ACCOUNT=?", [$storeUserId, $marker]) !== 1
        || $delete($s, "DELETE FROM $sStaff WHERE ID=? AND NAME=?", [$staffId, $marker]) !== 1
        || $delete($a, "DELETE FROM $aUser WHERE USER_ID=? AND NICK_NAME=?", [$aiId, $marker]) !== 1) {
        throw new RuntimeException('Identity deletion not exact');
    }
    $s->commit();
    $a->commit();
    if ($count($s, "SELECT COUNT(*) FROM $sOrder WHERE ID=?", [$orderId]) !== 0
        || $count($s, "SELECT COUNT(*) FROM $sUser WHERE ID=?", [$storeUserId]) !== 0
        || $count($s, "SELECT COUNT(*) FROM $sStaff WHERE ID=?", [$staffId]) !== 0
        || $count($a, "SELECT COUNT(*) FROM $aUser WHERE USER_ID=?", [$aiId]) !== 0
        || $count($a, "SELECT COUNT(*) FROM $aCart WHERE USER_ID=?", [$aiId]) !== 0) {
        throw new RuntimeException('Post-cleanup independent readback was nonzero');
    }
    echo json_encode(['status' => 'cleaned', 'marker' => $marker,
        'order_id' => $orderId, 'menu_rows' => $menu, 'cart_rows' => $cart,
        'remaining_rows' => 0], JSON_UNESCAPED_UNICODE) . PHP_EOL;
} catch (Throwable $error) {
    if ($s->inTransaction()) $s->rollBack();
    if ($a->inTransaction()) $a->rollBack();
    throw $error;
}
