<?php

return [\Doctrine\ORM\EntityManager::class => function (\Domynation\Config\ConfigInterface $config) {
    $devMode = !IS_PRODUCTION;
    $config = Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration($config->get('entityDirectories'), $devMode);
    if (IS_PRODUCTION) {
        $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ApcuCache());
        $config->setQueryCacheImpl(new \Doctrine\Common\Cache\ApcuCache());
    }
    // Uncomment the following to debug every request made to the DB
    //$config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSQLLogger);
    return Doctrine\ORM\EntityManager::create(['driver' => DB_DRIVER, 'dbname' => DB_DATABASE, 'user' => DB_USER, 'password' => DB_PASSWORD], $config);
}, \Doctrine\DBAL\Connection::class => function () {
    $db = \Doctrine\DBAL\DriverManager::getConnection(['driver' => DB_DRIVER, 'dbname' => DB_DATABASE, 'user' => DB_USER, 'password' => DB_PASSWORD], new \Doctrine\DBAL\Configuration());
    // @todo: Extremely ugly hack until all the event listeners are refactored.
    \Event::setDatabase($db);
    return $db;
}, \Domynation\Bus\CommandBusInterface::class => function (\Interop\Container\ContainerInterface $container, \Domynation\Authentication\AuthenticatorInterface $auth, \Domynation\Eventing\EventDispatcherInterface $dispatcher, \Domynation\Cache\CacheInterface $cache) {
    $busLogger = new Monolog\Logger('Bus_logger');
    $busLogger->pushHandler(new Monolog\Handler\StreamHandler(PATH_BASE . '/logs/bus.log', Monolog\Logger::INFO));
    return new Domynation\Bus\BasicCommandBus($container, $dispatcher, [new \Domynation\Bus\Middlewares\AuthorizationMiddleware($auth), new \Domynation\Bus\Middlewares\CachingMiddleware($cache), new \Domynation\Bus\Middlewares\LoggingMiddleware($busLogger, $auth), new \Domynation\Bus\Middlewares\HandlingMiddleware()]);
}, \Domynation\Http\Router::class => function (\Interop\Container\ContainerInterface $container, \Domynation\Authentication\UserInterface $user) {
    $routerLogger = new Monolog\Logger('Router_logger');
    $routerLogger->pushHandler(new Monolog\Handler\StreamHandler(PATH_BASE . '/logs/router.log', Monolog\Logger::INFO));
    return new \Domynation\Http\Router($container, new \Domynation\Http\AuthenticationMiddleware($user), new \Domynation\Http\AuthorizationMiddleware($user), new \Domynation\Http\ValidationMiddleware($container), new \Domynation\Http\LoggingMiddleware($routerLogger, $user), new \Domynation\Http\HandlingMiddleware($container));
}, \Domynation\Cache\CacheInterface::class => function () {
    switch (CACHE_DRIVER) {
        case 'redis':
            return new \Domynation\Cache\RedisCache(REDIS_HOST, REDIS_PORT);
        default:
            return new \Domynation\Cache\InMemoryCache();