<?php

declare(strict_types=1);

namespace App\Framework\Database;

final class Transaction
{
    public static function run(ConnectionInterface $connection, callable $callback): mixed
    {
        // Prüfe ob bereits eine Transaktion läuft
        if ($connection->inTransaction()) {
            // Keine neue Transaktion starten, direkt Callback ausführen
            return $callback();
        }

        $connection->beginTransaction();

        try {
            $result = $callback($connection);

            // Nur committen wenn wir noch in einer Transaktion sind
            if ($connection->inTransaction()) {
                $connection->commit();
            }

            return $result;
        } catch (\Throwable $e) {
            // Nur rollbacken wenn wir noch in einer Transaktion sind
            if ($connection->inTransaction()) {
                try {
                    $connection->rollback();
                } catch (\Throwable $rollbackException) {
                    // Rollback-Fehler ignorieren und Original-Exception weiterwerfen
                    // da die ursprüngliche Exception wichtiger ist
                }
            }

            throw $e;
        }
    }
}
