<?php

declare(strict_types=1);

// 项目根目录
use Phalcon\Autoload\Loader;

define('ROOT_PATH', dirname(__DIR__));

// 应用程序核心目录
const APP_PATH = ROOT_PATH . '/app/';

// 项目入口文件目录
const PUBLIC_PAT = ROOT_PATH . '/public/';

// 项目配置文件目录
const CONFIG_PATH = ROOT_PATH . '/config/';

error_reporting(E_ALL);

date_default_timezone_set('Asia/Shanghai');

try {
    require_once ROOT_PATH . '/vendor/autoload.php';

    /**
     * Load ENV variables
     */
    \Dotenv\Dotenv::createImmutable(ROOT_PATH)->load();

    $loader = new Loader();
    $loader->setDirectories([
        APP_PATH . '/Controllers/',
        APP_PATH . '/Models/',
        APP_PATH . '/Views/',
        APP_PATH . '/Plugins/',
        APP_PATH . '/Providers/',
        APP_PATH . '/Services/',
        CONFIG_PATH,
    ]);
    $loader->register();

    $di = new Phalcon\Di\FactoryDefault();

    /**
     * Register Service Providers
     */
    $providers = CONFIG_PATH . 'providers.php';
    if (!file_exists($providers) || !is_readable($providers)) {
        throw new Exception('File providers.php does not exist or is not readable.');
    }

    /** @var array $providers */
    $providers = include_once $providers;
    foreach ($providers as $provider) {
        $di->register(new $provider());
    }

    /**
     * Init MVC Application and send output to a client
     */
    $application = new \Phalcon\Mvc\Application($di);
    $application->setEventsManager($di->get('eventsManager'));
    $application->handle(new Phalcon\Http\Request()->getURI())
                ->send();
}  catch (\Throwable $e) {
    $logger = new \Monolog\Logger('PandaCup');
    $logDir = ROOT_PATH . '/var/logs';
    if (! file_exists($logDir)) {
        mkdir($logDir, 0777, true);
    }
    $logFile = $logDir . '/error.log';

    $logger->pushHandler(new \Monolog\Handler\StreamHandler($logFile, Monolog\Logger::WARNING));
    $logger->error('Application Exception', [
        'Class' => get_class($e) . ': ' . $e->getMessage(),
        'File' => $e->getFile() . ':' . $e->getLine(),
        'Trace' => $e->getTraceAsString()
    ]);

    echo 'ooh!!! System Exception: Please contact the system maintainer.';
}