<?php

declare(strict_types=1);

namespace App\Framework\Queue;

use App\Framework\Core\PathProvider;
use App\Framework\DI\Initializer;
use App\Framework\Logging\Logger;
use App\Framework\Logging\ValueObjects\LogContext;
use App\Framework\Queue\Exceptions\RedisExtensionNotLoadedException;
use App\Framework\Redis\RedisConfig;
use App\Framework\Redis\RedisConnection;

final readonly class QueueInitializer
{
    public function __construct(
        private PathProvider $pathProvider
    ) {
    }

    #[Initializer]
    public function __invoke(Logger $logger): Queue
    {
        try {
            // Check if Redis extension is available
            if (! extension_loaded('redis')) {
                throw RedisExtensionNotLoadedException::notLoaded();
            }

            $redisConfig = new RedisConfig(
                host: 'redis',
                port: 6379,
                database: 2 // Use DB 2 for queue
            );
            $redisConnection = new RedisConnection($redisConfig, 'queue');

            return new RedisQueue($redisConnection, 'commands');
        } catch (\Throwable $e) {
            // Fallback to file queue if Redis is not available
            $logger->info("Using file queue (Redis not available)", LogContext::withData([
                'reason' => $e->getMessage(),
                'fallback' => 'FileQueue',
            ]));
            $path = $this->pathProvider->resolvePath('/storage/queue/');

            return new FileQueue($path, logger: $logger);
        }
    }
}
