<?php

namespace MintyPHP\Tests\App\Module;

use MintyPHP\App\AppContainer;
use MintyPHP\App\Module\ModuleRegistry;
use MintyPHP\Http\RouteCatalog;
use MintyPHP\Http\RouteRegistrar;
use MintyPHP\Tests\Support\AppContainerIsolationTrait;
use PHPUnit\Framework\TestCase;

final class RouterConfigCollisionTest extends TestCase
{
    use AppContainerIsolationTrait;

    /**
     * @runInSeparateProcess
     */
    public function testModuleRoutePathCollidingWithCoreRouteThrows(): void
    {
        $fixturesDir = sys_get_temp_dir() . '/router-config-collision-' . uniqid();
        mkdir($fixturesDir . '/mod-a', 0777, true);
        file_put_contents(
            $fixturesDir . '/mod-a/module.php',
            '<?php return ' . var_export([
                'id' => 'mod-a',
                'routes' => [
                    ['path' => 'login', 'target' => 'mod-a/login'],
                ],
            ], true) . ';'
        );
        file_put_contents(
            $fixturesDir . '/core-routes.php',
            '<?php return ' . var_export([
                ['path' => 'login', 'target' => 'auth/login'],
            ], true) . ';'
        );

        try {
            $registry = ModuleRegistry::boot($fixturesDir, ['mod-a']);

            $container = new AppContainer();
            $container->set(ModuleRegistry::class, static fn (): ModuleRegistry => $registry);
            $this->pushAppContainer($container);

            $this->expectException(\RuntimeException::class);
            $this->expectExceptionMessage('Module route path conflict');

            $catalog = RouteCatalog::fromConfigFile($fixturesDir . '/core-routes.php');
            (new RouteRegistrar($registry))->register($catalog);
        } finally {
            $this->restoreAppContainer();
            @unlink($fixturesDir . '/core-routes.php');
            @unlink($fixturesDir . '/mod-a/module.php');
            @rmdir($fixturesDir . '/mod-a');
            @rmdir($fixturesDir);
        }
    }
}
