<?php

declare(strict_types=1);

$dialect = getenv('POC_DIALECT');
$sourceMarker = getenv('POC_MARKER');
$shopNo = getenv('POC_SHOP_ORDER_NO');
$refundNo = getenv('POC_REFUND_NO');
if (!in_array($dialect, ['mysql', 'dm'], true)
    || !preg_match('/^CDXPAY[A-F0-9]{8}$/', (string)$sourceMarker)
    || !preg_match('/^[0-9]{15}$/', (string)$shopNo)
    || !preg_match('/^RF[0-9]{15}$/', (string)$refundNo)) 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);
};
$row = static function (PDO $pdo, string $sql, array $params): array {
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    return array_change_key_case($stmt->fetch(PDO::FETCH_ASSOC) ?: [], CASE_LOWER);
};
$count = static function (PDO $pdo, string $sql, array $params = []): int {
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    return (int)$stmt->fetchColumn();
};
$shop = $row($store, 'SELECT ID,USER_ID,PAY_PRICE,REMAIN_CASH,REFUND_AMOUNT,REFUND_STATUS FROM '
    . $s('meal_order') . ' WHERE ORDER_NO=?', [$shopNo]);
$refund = $row($store, 'SELECT ID,MEAL_ORDER_ID,REFUND_AMOUNT,REFUND_STATUS FROM '
    . $s('meal_order_refund') . ' WHERE ORDER_NO=?', [$refundNo]);
$source = $row($store, 'SELECT PAY_PRICE FROM ' . $s('meal_order') . ' WHERE MSGID=?', [$sourceMarker]);
if (!$shop || !$refund || !$source) throw new RuntimeException('Expected synthetic order/refund missing');
$aiUser = $row($store, 'SELECT AI_USER_ID FROM ' . $s('user') . ' WHERE ID=?', [(int)$shop['user_id']]);
$balance = $row($ai, 'SELECT BALANCE FROM ' . $a('user') . ' WHERE USER_ID=?', [(int)$aiUser['ai_user_id']]);
$consumeSettlements = $count($ai, 'SELECT COUNT(*) FROM ' . $a('account_settlement')
    . " WHERE BIZ_TYPE='consume' AND BIZ_ORDER_NO=?", [$shopNo]);
$refundSettlements = $count($ai, 'SELECT COUNT(*) FROM ' . $a('account_settlement')
    . " WHERE BIZ_TYPE='refund' AND REFUND_NO=?", [$refundNo]);
$cashConsume = $count($ai, 'SELECT COUNT(*) FROM ' . $a('user_balance_log')
    . ' WHERE ORDER_ID=? AND USER_ID=? AND MONEY<0', [(int)$shop['id'], (int)$aiUser['ai_user_id']]);
$cashRefund = $count($ai, 'SELECT COUNT(*) FROM ' . $a('user_balance_log')
    . ' WHERE ORDER_ID=? AND USER_ID=? AND MONEY>0', [(int)$refund['id'], (int)$aiUser['ai_user_id']]);
$authRows = $count($store, 'SELECT COUNT(*) FROM ' . $s('api_auth') . " WHERE ACCOUNT LIKE 'CDXRF%'");
$cardRows = $count($store, 'SELECT COUNT(*) FROM ' . $s('staff_card') . " WHERE CARD_ID LIKE 'CDXCARD%'");
echo json_encode(['dialect' => $dialect, 'shop_order_id' => (int)$shop['id'],
    'refund_id' => (int)$refund['id'],
    'full_refund_recorded' => abs((float)$shop['refund_amount'] - (float)$shop['pay_price']) < 0.01
        && abs((float)$refund['refund_amount'] - (float)$shop['pay_price']) < 0.01,
    'balance_restored' => abs((float)$balance['balance']
        - ((float)$shop['remain_cash'] + (float)$shop['pay_price'])) < 0.01,
    'consume_settlements' => $consumeSettlements, 'refund_settlements' => $refundSettlements,
    'cash_consume_logs' => $cashConsume, 'cash_refund_logs' => $cashRefund,
    'temporary_auth_rows' => $authRows, 'temporary_card_rows' => $cardRows]) . PHP_EOL;
