<?php

namespace MintyPHP\Http;

use MintyPHP\App\Module\ModuleRegistry;
use MintyPHP\Router;
use RuntimeException;

/**
 * Registers core + module routes into the runtime router.
 */
final class RouteRegistrar
{
    public function __construct(private readonly ModuleRegistry $moduleRegistry)
    {
    }

    public function register(RouteCatalog $catalog): void
    {
        $coreRoutePaths = [];
        foreach ($catalog->coreRoutes() as $route) {
            $path = trim($route['path']);
            $target = trim($route['target']);
            if ($path === '' || $target === '') {
                continue;
            }

            $coreRoutePaths[$path] = $target;
            Router::addRoute($path, $target);
        }

        $modulePaths = [];
        foreach ($this->moduleRegistry->getRoutes() as $route) {
            $path = trim($route['path']);
            $target = trim($route['target']);
            $moduleId = trim($route['module_id']);
            if ($path === '' || $target === '') {
                continue;
            }

            if (isset($coreRoutePaths[$path])) {
                throw new RuntimeException(
                    "Module route path conflict: '{$path}' from module '{$moduleId}' collides with core route target '{$coreRoutePaths[$path]}'."
                );
            }
            if (isset($modulePaths[$path])) {
                throw new RuntimeException(
                    "Module route path conflict: '{$path}' from module '{$moduleId}' collides with module '{$modulePaths[$path]}'."
                );
            }

            $modulePaths[$path] = $moduleId;
            Router::addRoute($path, $target);
        }
    }
}
