<?php

use function DI\autowire, DI\create, DI\get;

use League\Route\Strategy\ApplicationStrategy,
    League\Route\Router;

use Psr\Container\ContainerInterface;

use Cronard\CronardMiddleware;

use Notes\Route\RouteFetcher;

use Notes\Breadcrumb\Breadcrumb;

use Storage\SessionMiddleware;

use Ulmus\User\Middleware\{
    HeaderAuthenticationMiddleware,
    PostRequestAuthenticationMiddleware
};

return [
    Lean\Routing::class => autowire(Lean\Routing::class),

    RouteFetcher::class => function($c) {
        $fetcher = new RouteFetcher(null, [], null, $c->get('routes.caching'));

        $fetcher->setFolderList(array_map(function($item) {
            return $item;
        }, $c->get(Lean\Lean::class)->getRoutable()));

        return $fetcher;
    },

    Breadcrumb::class => function($c) {
        $breadcrumb = new Breadcrumb(null, [], null, $c->get('breadcrumbs.caching'));

        $breadcrumb->setFolderList(array_map(function($item) {
            return $item;
        }, $c->get(Lean\Lean::class)->getRoutable()));

        return $breadcrumb;
    },

    ApplicationStrategy::class => autowire(\Lean\ApplicationStrategy::class),

    'routes.middlewares'  => [
        "dump", "errorHandler", SessionMiddleware::class, CronardMiddleware::class, Mcnd\Event\EventMiddleware::class, Mcnd\CLI\CliMiddleware::class,
    ],

    'app.middlewares' => [
        # HeaderAuthenticationMiddleware::class,
        # PostRequestAuthenticationMiddleware::class,
    ],

    Lean\Routing\RouteDefinitionInterface::class => function($c) {
        return function (ContainerInterface $container) {
            $router = $container->get(Router::class);

            foreach([ 'routes.middlewares', 'app.middlewares' ] as $key) {
                if ( $container->has($key) ) {
                    foreach ($container->get($key) as $i => $middleware) {
                        if ($container->has($middleware)) {
                            $router->middleware($container->get($middleware));
                        }
                    }
                }
            }

            $routing = $container->get(Lean\Routing::class);
            $routing->registerRoute($container, getenv('URL_BASE'));

            return $router;
        };
    },
];