<?php

use Xentral\Core\DependencyInjection\ServiceContainer;
use Xentral\Core\DependencyInjection\ServiceRegistry;
use Xentral\Core\Installer\ClassMapGenerator;
use Xentral\Core\Installer\Installer;
use Xentral\Core\Installer\InstallerCacheConfig;
use Xentral\Core\Installer\InstallerCacheWriter;
use Xentral\Core\Installer\Psr4ClassNameResolver;
use Xentral\Core\LegacyConfig\ConfigLoader;

require dirname(__DIR__) . '/vendor/autoload.php';

//ini_set('display_errors', true);
//ini_set('error_reporting', E_ERROR);
//date_default_timezone_set('UTC');

//set_exception_handler(array('\Xentral\Modules\Api\Error\ErrorHandler', 'handleException'));
//set_error_handler(array('\Xentral\Modules\Api\Error\ErrorHandler', 'handleError'));
//register_shutdown_function();

//define('DEVELOPMENT_MODE', true);

require_once dirname(__DIR__) . '/conf/main.conf.php';

$config = ConfigLoader::load();
$cacheConfig = new InstallerCacheConfig($config->WFuserdata . '/tmp/' . $config->WFdbname);
$serviceCacheFile = $cacheConfig->getServiceCacheFile();
$factoryServiceMap = @include $serviceCacheFile;

if (!is_file($serviceCacheFile)) {

    // Installer ausführen, wenn ServiceMap nicht vorhanden ist
    $resolver = new Psr4ClassNameResolver();
    $resolver->addNamespace('Xentral\\', __DIR__);
    $resolver->excludeFile(__DIR__ . DIRECTORY_SEPARATOR . 'bootstrap.php');

    $generator = new ClassMapGenerator($resolver, __DIR__);
    $installer = new Installer($generator, $resolver);
    $writer = new InstallerCacheWriter($cacheConfig, $installer);

    $writer->writeServiceCache();
    $writer->writeJavascriptCache();

    // Erzeugte ServiceMap einbinden
    $factoryServiceMap = @include $serviceCacheFile;
    if ($factoryServiceMap === false) {
        throw new RuntimeException(sprintf(
            'Cache-Datei "%s" konnte nicht erzeugt werden. Vermutlich fehlen Schreibrechte in %s',
            $serviceCacheFile, $this->config->getUserDataTempDir()
        ));
    }
}

$registry = new ServiceRegistry();
$registry->add('ServiceContainer', new ServiceContainer($registry));
$registry->addFactories($factoryServiceMap);

return $registry;