<?php

declare(strict_types = 1);

// inspired by https://github.com/phpstan/phpstan/blob/master/bootstrap.php

spl_autoload_register(function (string $class): void {
    static $composerAutoloader;

    // already loaded in bin/rector.php
    if (defined('__RECTOR_RUNNING__')) {
        return;
    }

    // load prefixed or native class, e.g. for running tests
    if (strpos($class, 'RectorPrefix') === 0 || strpos($class, 'Rector\\') === 0) {
        if ($composerAutoloader === null) {
            // prefixed version autoload
            $composerAutoloader = require __DIR__ . '/vendor/autoload.php';
        }
        $composerAutoloader->loadClass($class);
    }

    // aliased by php-scoper, that's why its missing
    if ($class === 'Symplify\SmartFileSystem\SmartFileInfo') {
        $filePath = __DIR__ . '/vendor/symplify/smart-file-system/src/SmartFileInfo.php';
        if (file_exists($filePath)) {
            require $filePath;
        }
    }

    if ($class === 'Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator') {
        // avoid duplicated autoload bug in Rector demo runner
        if (class_exists('Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator', false)) {
            return;
        }
    }
});

if (! interface_exists('UnitEnum')) {
    /**
     * @since 8.1
     */
    interface UnitEnum
    {
        /**
         * @return static[]
         */
        public static function cases(): array;
    }
}

if (! interface_exists('BackedEnum')) {
    /**
     * @since 8.1
     */
    interface BackedEnum extends UnitEnum {
        /**
         * @param int|string $value
         * @return $this
         */
        public static function from($value);

        /**
         * @param int|string $value
         * @return $this|null
         */
        public static function tryFrom($value);
    }
}
