<?php

declare(strict_types=1);

// Exact recovery of one synthetic DM evaluation marker. Read-only unless POC_APPLY=1.
$marker = (string)getenv('POC_RECOVER_MARKER');
$orderMarker = (string)getenv('POC_ORDER_MARKER');
$orderId = (int)getenv('POC_ORDER_ID');
$apply = getenv('POC_APPLY') === '1';
if (!preg_match('/^CDXPAREVAL[A-F0-9]{8}$/D', $marker)
    || !preg_match('/^CDXPAY[A-F0-9]{8}$/D', $orderMarker) || $orderId <= 0
    || getenv('POC_DIALECT') !== 'dm') throw new RuntimeException('Invalid synthetic recovery target');
foreach (['POC_HOST', 'POC_PORT', 'POC_SCHEMA', 'POC_USER', 'POC_PASSWORD'] as $name) {
    if (getenv($name) === false) throw new RuntimeException('Isolated DM environment incomplete');
}
$pdo = new PDO('dm:host=' . getenv('POC_HOST') . ';port=' . getenv('POC_PORT')
    . ';schema=' . getenv('POC_SCHEMA'), getenv('POC_USER'), getenv('POC_PASSWORD'),
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$one = static function (string $sql, array $params = []) use ($pdo): array {
    $q = $pdo->prepare($sql); $q->execute($params);
    return array_change_key_case($q->fetch(PDO::FETCH_ASSOC) ?: [], CASE_LOWER);
};
$count = static function (string $sql, array $params = []) use ($pdo): int {
    $q = $pdo->prepare($sql); $q->execute($params); return (int)$q->fetchColumn();
};
$order = $one('SELECT o.ID,o.MSGID,o.USER_ID,o.EVALUATE_STATUS,o.EVALUATE_ID,u.ACCOUNT,u.UUID'
    . ' FROM YDY_MEAL_ORDER o JOIN YDY_USER u ON u.ID=o.USER_ID WHERE o.ID=?', [$orderId]);
if (!$order || (string)$order['msgid'] !== $orderMarker
    || (string)$order['account'] !== $orderMarker
    || strpos((string)$order['uuid'], 'CDXUSER-') !== 0) {
    throw new RuntimeException('Not the approved synthetic order');
}
$allEvaluations = $count('SELECT COUNT(*) FROM YDY_ORDER_EVALUATE WHERE MEAL_ORDER_ID=?', [$orderId]);
$owned = $one('SELECT ID FROM YDY_ORDER_EVALUATE WHERE MEAL_ORDER_ID=? AND "COMMENT"=?',
    [$orderId, $marker]);
$ownedCount = $count('SELECT COUNT(*) FROM YDY_ORDER_EVALUATE WHERE MEAL_ORDER_ID=? AND "COMMENT"=?',
    [$orderId, $marker]);
$ownedId = (int)($owned['id'] ?? 0);
$allDetails = $count('SELECT COUNT(*) FROM YDY_ORDER_EVALUATE_DETAIL WHERE MEAL_ORDER_ID=?', [$orderId]);
$ownedDetails = $ownedId ? $count(
    'SELECT COUNT(*) FROM YDY_ORDER_EVALUATE_DETAIL WHERE EVALUATE_ID=? AND "COMMENT"=?',
    [$ownedId, $marker]) : 0;
$result = [
    'marker' => $marker, 'order_id' => $orderId,
    'order_evaluate_status' => (int)$order['evaluate_status'],
    'order_evaluate_id' => (int)$order['evaluate_id'],
    'all_evaluation_rows' => $allEvaluations, 'marker_evaluation_rows' => $ownedCount,
    'all_detail_rows' => $allDetails, 'marker_detail_rows' => $ownedDetails,
    'applied' => false,
];
if ($apply) {
    if ((int)$order['evaluate_status'] !== 1 || (int)$order['evaluate_id'] !== 0
        || $allEvaluations !== $ownedCount || $allDetails !== $ownedDetails
        || $ownedCount > 1) {
        throw new RuntimeException('Recovery guard not met; preserving marker for review');
    }
    if ($ownedCount === 1) {
        $pdo->beginTransaction();
        try {
            $delete = $pdo->prepare('DELETE FROM YDY_ORDER_EVALUATE_DETAIL WHERE EVALUATE_ID=? AND "COMMENT"=?');
            $delete->execute([$ownedId, $marker]);
            if ($delete->rowCount() !== $ownedDetails) throw new RuntimeException('Detail delete mismatch');
            $delete = $pdo->prepare('DELETE FROM YDY_ORDER_EVALUATE WHERE ID=? AND MEAL_ORDER_ID=? AND "COMMENT"=?');
            $delete->execute([$ownedId, $orderId, $marker]);
            if ($delete->rowCount() !== 1) throw new RuntimeException('Evaluation delete mismatch');
            $pdo->commit();
        } catch (Throwable $e) {
            if ($pdo->inTransaction()) $pdo->rollBack();
            throw $e;
        }
    }
    $result['applied'] = true;
    $result['remaining_marker_evaluations'] = $count(
        'SELECT COUNT(*) FROM YDY_ORDER_EVALUATE WHERE MEAL_ORDER_ID=? AND "COMMENT"=?',
        [$orderId, $marker]);
    $result['remaining_marker_details'] = $count(
        'SELECT COUNT(*) FROM YDY_ORDER_EVALUATE_DETAIL WHERE MEAL_ORDER_ID=? AND "COMMENT"=?',
        [$orderId, $marker]);
}
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL;
