<?php

declare(strict_types=1);

$dsn = getenv('POC_DSN');
$user = getenv('POC_USER');
$password = getenv('POC_PASSWORD');
if (!$dsn || !$user || !$password) exit(2);
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
$first = new PDO($dsn, $user, $password, $options);
$second = new PDO($dsn, $user, $password, $options);
$lockId = 973280000 + random_int(100, 999);
$requestSql = 'SELECT DBMS_LOCK.REQUEST(?,6,?) FROM DUAL';
$releaseSql = 'SELECT DBMS_LOCK.RELEASE(?) FROM DUAL';
$firstHasLock = false;
$secondHasLock = false;
try {
    $stmt = $first->prepare($requestSql);
    $stmt->execute([$lockId, 0]);
    $firstHasLock = (int)$stmt->fetchColumn() === 0;
    if (!$firstHasLock) throw new RuntimeException('First session did not acquire lock');

    $stmt = $second->prepare($requestSql);
    $stmt->execute([$lockId, 0]);
    $busyCode = (int)$stmt->fetchColumn();
    if ($busyCode !== 1) throw new RuntimeException('Second session was not marked busy');

    $stmt = $first->prepare($releaseSql);
    $stmt->execute([$lockId]);
    if ((int)$stmt->fetchColumn() !== 0) throw new RuntimeException('First release failed');
    $firstHasLock = false;

    $stmt = $second->prepare($requestSql);
    $stmt->execute([$lockId, 0]);
    $secondHasLock = (int)$stmt->fetchColumn() === 0;
    if (!$secondHasLock) throw new RuntimeException('Second session could not acquire released lock');
    echo json_encode(['first_acquired' => true, 'second_busy' => true, 'second_after_release' => true]) . PHP_EOL;
} finally {
    if ($firstHasLock) {
        $stmt = $first->prepare($releaseSql);
        $stmt->execute([$lockId]);
    }
    if ($secondHasLock) {
        $stmt = $second->prepare($releaseSql);
        $stmt->execute([$lockId]);
    }
}
