<?php

declare(strict_types=1);

$marker = getenv('POC_MARKER');
$dialect = getenv('POC_DIALECT');
if (!$marker || !preg_match('/^CDXPAY[A-F0-9]{8}$/', $marker)
    || !in_array($dialect, ['mysql', 'dm'], true)) exit(2);
$connect = static function (bool $ai) use ($dialect): PDO {
    $prefix = $ai ? 'POC_AI_' : 'POC_';
    $host = getenv($prefix . 'HOST');
    $port = getenv($prefix . 'PORT');
    $schema = getenv($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($prefix . 'USER'), getenv($prefix . 'PASSWORD'),
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
};
$store = $connect(false);
$ai = $connect(true);
$s = static function (string $name) use ($dialect): string {
    return $dialect === 'dm' ? 'YDY_' . strtoupper($name) : 'ydy_' . strtolower($name);
};
$a = static function (string $name) use ($dialect): string {
    return $dialect === 'dm' ? 'YOSHOP_' . strtoupper($name) : 'yoshop_' . strtolower($name);
};
$stmt = $store->prepare('SELECT ID,ORDER_NO,PAY_PRICE,USER_ID,ORDER_STATUS,REFUND_STATUS FROM '
    . $s('meal_order') . ' WHERE MSGID=?');
$stmt->execute([$marker]);
$order = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$order) {
    echo json_encode(['dialect' => $dialect, 'marker' => $marker, 'order_exists' => false]) . PHP_EOL;
    exit(3);
}
$order = array_change_key_case($order, CASE_LOWER);
$id = (int)$order['id'];
$orderNo = (string)$order['order_no'];
$userStmt = $store->prepare('SELECT AI_USER_ID FROM ' . $s('user') . ' WHERE ID=?');
$userStmt->execute([(int)$order['user_id']]);
$aiUserId = (int)$userStmt->fetchColumn();
$balanceStmt = $ai->prepare('SELECT BALANCE FROM ' . $a('user') . ' WHERE USER_ID=?');
$balanceStmt->execute([$aiUserId]);
$balance = (float)$balanceStmt->fetchColumn();
$walletStmt = $ai->prepare('SELECT BALANCE,GIFT_BALANCE FROM ' . $a('user')
    . ' WHERE USER_ID=?');
$walletStmt->execute([$aiUserId]);
$wallet = array_change_key_case($walletStmt->fetch(PDO::FETCH_ASSOC) ?: []);
$settlementStmt = $ai->prepare('SELECT CASH_AMOUNT,SUBSIDY_AMOUNT,GIFT_AMOUNT FROM '
    . $a('account_settlement') . ' WHERE BIZ_ORDER_NO=?');
$settlementStmt->execute([$orderNo]);
$settlement = array_change_key_case($settlementStmt->fetch(PDO::FETCH_ASSOC) ?: []);
$rechargeStmt = $ai->prepare('SELECT PAY_PRICE,GIFT_MONEY,ACTUAL_MONEY FROM '
    . $a('recharge_order') . ' WHERE USER_ID=? ORDER BY ORDER_ID DESC');
$rechargeStmt->execute([$aiUserId]);
$recharge = array_change_key_case($rechargeStmt->fetch(PDO::FETCH_ASSOC) ?: []);
$count = static function (PDO $pdo, string $table, string $column, $value): int {
    $stmt = $pdo->prepare("SELECT COUNT(*) FROM $table WHERE $column=?");
    $stmt->execute([$value]);
    return (int)$stmt->fetchColumn();
};
echo json_encode(['dialect' => $dialect, 'marker' => $marker, 'order_id' => $id,
    'pay_positive' => (float)$order['pay_price'] > 0,
    'balance_matches' => $aiUserId > 0 && abs($balance - (100 - (float)$order['pay_price'])) < 0.01,
    'auth_rows' => $count($store, $s('api_auth'), 'ACCOUNT', $marker),
    'settlements' => $count($ai, $a('account_settlement'), 'BIZ_ORDER_NO', $orderNo),
    'cash_logs' => $count($ai, $a('user_balance_log'), 'ORDER_ID', $id),
    'menu_rows' => $count($store, $s('initial_menu'), 'MEAL_ORDER_ID', $id),
    'pickup_rows' => $count($store, $s('meal_order_pickup'), 'MEAL_ORDER_ID', $id),
    'order_pay_price' => (string)$order['pay_price'],
    'order_status' => (int)$order['order_status'],
    'refund_status' => (int)$order['refund_status'],
    'wallet' => $wallet, 'settlement_split' => $settlement,
    'recharge' => $recharge]) . PHP_EOL;
