<?php

declare(strict_types=1);

namespace App\Framework\Async;

/**
 * Factory für AsyncPromise Instanzen mit proper Dependency Injection
 */
final readonly class AsyncPromiseFactory
{
    public function __construct(
        private FiberManager $fiberManager
    ) {
    }

    /**
     * Erstellt ein resolved Promise
     */
    public function resolve(mixed $value): AsyncPromise
    {
        return AsyncPromise::resolve($value, $this->fiberManager);
    }

    /**
     * Erstellt ein rejected Promise
     */
    public function reject(\Throwable $exception): AsyncPromise
    {
        return AsyncPromise::reject($exception, $this->fiberManager);
    }

    /**
     * Erstellt Promise aus Callable
     */
    public function create(callable $executor): AsyncPromise
    {
        return AsyncPromise::create($executor, $this->fiberManager);
    }

    /**
     * Wartet auf alle Promises (variadic)
     */
    public function all(AsyncPromise ...$promises): AsyncPromise
    {
        return AsyncPromise::all($promises, $this->fiberManager);
    }

    /**
     * Wartet auf das erste erfolgreiche Promise (variadic)
     */
    public function race(AsyncPromise ...$promises): AsyncPromise
    {
        return AsyncPromise::race($promises, $this->fiberManager);
    }

    /**
     * Erstellt ein Promise mit direktem FiberManager Zugriff
     * Für fortgeschrittene Use-Cases
     */
    public function createWithManager(callable $executor): AsyncPromise
    {
        return new AsyncPromise($this->fiberManager);
    }
}
