<?php

declare(strict_types=1);

$root = getenv('POC_TARGET_ROOT');
$dialect = getenv('POC_DIALECT');
if (!$root || !in_array($dialect, ['mysql', 'dm'], true)) exit(2);
$config = require $root . '/application/database.php';
$dsn = $dialect === 'dm'
    ? 'dm:host=' . $config['hostname'] . ';port=' . $config['hostport'] . ';schema=' . $config['database']
    : 'mysql:host=' . $config['hostname'] . ';port=' . $config['hostport']
        . ';dbname=' . $config['database'] . ';charset=utf8mb4';
$pdo = new PDO($dsn, $config['username'], $config['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$workTable = $dialect === 'dm' ? 'YDY_CONSUME_ORDER_WORK' : 'ydy_consume_order_work';
$orderTable = $dialect === 'dm' ? 'YDY_MEAL_ORDER' : 'ydy_meal_order';
$list = $pdo->prepare('SELECT ID,MSGID FROM ' . $workTable
    . " WHERE MSGID LIKE 'shop_CDXCARD%' AND STATUS IN (10,30)"
    . " AND CREATE_TIME>='2026-09-29 00:00:00' ORDER BY ID");
$list->execute();
$works = array_map('array_change_key_case', $list->fetchAll(PDO::FETCH_ASSOC));
$findOrder = $pdo->prepare('SELECT ID,ORDER_NO FROM ' . $orderTable . ' WHERE MSGID=? AND IS_DELETE=0');
$linked = 0;
$orphaned = 0;
$actions = [];
foreach ($works as $work) {
    $msgid = (string)$work['msgid'];
    if (strpos($msgid, 'shop_CDXCARD') !== 0) throw new RuntimeException('Unexpected work identity');
    $findOrder->execute([$msgid]);
    $orders = array_map('array_change_key_case', $findOrder->fetchAll(PDO::FETCH_ASSOC));
    if (count($orders) > 1) throw new RuntimeException('Multiple orders for synthetic work');
    $actions[] = ['id' => (int)$work['id'], 'msgid' => $msgid, 'order' => $orders[0] ?? null];
    $orders ? $linked++ : $orphaned++;
}
if (getenv('POC_CLEAN_TEST_WORK') !== '1') {
    echo json_encode(['dialect' => $dialect, 'mode' => 'dry-run',
        'failed_test_works' => count($actions), 'would_link' => $linked,
        'would_delete_orphans' => $orphaned]) . PHP_EOL;
    exit(0);
}
$updated = 0;
$deleted = 0;
$pdo->beginTransaction();
try {
    $update = $pdo->prepare('UPDATE ' . $workTable
        . " SET STATUS=20,MEAL_ORDER_ID=?,ORDER_NO=?,FAIL_MESSAGE='',CONSUME_TIME=?,UPDATE_TIME=?"
        . ' WHERE ID=? AND MSGID=? AND STATUS IN (10,30)');
    $delete = $pdo->prepare('DELETE FROM ' . $workTable
        . ' WHERE ID=? AND MSGID=? AND STATUS IN (10,30)');
    foreach ($actions as $action) {
        if ($action['order']) {
            $now = date('Y-m-d H:i:s');
            $update->execute([(int)$action['order']['id'], (string)$action['order']['order_no'],
                $now, $now, $action['id'], $action['msgid']]);
            $updated += $update->rowCount();
        } else {
            $delete->execute([$action['id'], $action['msgid']]);
            $deleted += $delete->rowCount();
        }
    }
    if ($updated !== $linked || $deleted !== $orphaned) {
        throw new RuntimeException('Synthetic work cleanup affected-row mismatch');
    }
    $pdo->commit();
} catch (Throwable $error) {
    $pdo->rollBack();
    throw $error;
}
$list->execute();
echo json_encode(['dialect' => $dialect, 'mode' => 'applied',
    'linked_successful_orders' => $updated, 'deleted_orphan_test_works' => $deleted,
    'remaining_failed_test_works' => count($list->fetchAll(PDO::FETCH_ASSOC))]) . PHP_EOL;
