#!/usr/bin/env php
<?php

use Laminas\Mvc\Application as MvcApplication;
use Laminas\Stdlib\ArrayUtils;

/**
 * @return array|Interop\Container\ContainerInterface
 * @throws RuntimeException
 */
function __findAppConfig(string $path)
{
    if (!file_exists($path)) {
        chdir(__DIR__);

        $previousDir = '.';

        // Search for the config
        while (!file_exists($path)) {
            $dir = dirname(getcwd());

            if ($previousDir === $dir) {
                throw new RuntimeException(
                    sprintf(
                        'Unable to locate "%s": is Fabiang\AsseticBundle in a subdir of your application skeleton?',
                        $path
                    )
                );
            }

            $previousDir = $dir;
            chdir($dir);
        }
    }

    return include $path;
}

function __mergeDevelopmentConfig(array $appConfig): array
{
    if (file_exists('config/development.config.php')) {
        $appConfig = ArrayUtils::merge($appConfig, include 'config/development.config.php');
    }
    return $appConfig;
}

if (file_exists(__DIR__ . '/../vendor/autoload.php')) {
    include_once __DIR__ . '/../vendor/autoload.php';
} elseif (file_exists(__DIR__ . '/../../../autoload.php')) {
    include_once __DIR__ . '/../../../autoload.php';
} else {
    throw new RuntimeException(
        'Error: vendor/autoload.php could not be found. Did you run "php composer.phar install"?'
    );
}

// MVC application
if (class_exists(MvcApplication::class)) {
    $appConfig = __findAppConfig('config/application.config.php');
    $appConfig = __mergeDevelopmentConfig($appConfig);

    // init Laminas Application
    $application = MvcApplication::init($appConfig);

    $container = $application->getServiceManager();
} else {
    $container = __findAppConfig('config/container.php');

    /** @var \Mezzio\Application $app */
    $application = $container->get(\Mezzio\Application::class);
    $factory     = $container->get(\Mezzio\MiddlewareFactory::class);

    // Execute programmatic/declarative middleware pipeline and routing
    // configuration statements
    (require 'config/pipeline.php')($application, $factory, $container);
    (require 'config/routes.php')($application, $factory, $container);
}

/* @var $cli \Symfony\Console\Application */
$cli = $container->get('Fabiang\AsseticBundle\Cli');
exit($cli->run());
