<?php
/***
 *  ░   ░░░  ░░░      ░░░   ░░░  ░░   ░░░  ░░  ░░░░  ░░░      ░░░░      ░░░░      ░░░░      ░░░        ░
 *  ▒    ▒▒  ▒▒  ▒▒▒▒  ▒▒    ▒▒  ▒▒    ▒▒  ▒▒▒  ▒▒  ▒▒▒  ▒▒▒▒▒▒▒▒  ▒▒▒▒  ▒▒  ▒▒▒▒  ▒▒  ▒▒▒▒▒▒▒▒  ▒▒▒▒▒▒▒
 *  ▓  ▓  ▓  ▓▓  ▓▓▓▓  ▓▓  ▓  ▓  ▓▓  ▓  ▓  ▓▓▓▓    ▓▓▓▓  ▓▓▓   ▓▓  ▓▓▓▓  ▓▓  ▓▓▓▓  ▓▓▓      ▓▓▓      ▓▓▓
 *  █  ██    ██        ██  ██    ██  ██    █████  █████  ████  ██  ████  ██  ████  ████████  ██  ███████
 *  █  ███   ██  ████  ██  ███   ██  ███   █████  ██████      ████      ████      ████      ███        █
 *
 *                 •   •
 *    ┓┏┏┏┓┏┓┏┓┓┏┏┏┓┏┏┏┓
 *    ┗┻┛┗┻┛┗┗┫┗┻┛┗┗┻┛┗┗
 *            ┛
 *  2024.10.30
 */
declare(strict_types = 1);

use Dotenv\Dotenv;
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Application;

try {
    $rootPath = dirname(__DIR__);
    require_once $rootPath . '/vendor/autoload.php';
    
    // 加载 ENV 变量 ../.env
    Dotenv::createImmutable($rootPath)->load();
    
    //$_ENV['WECHAT_MCH_PRIVATE_KEY_PATH']     = 'file://' . $rootPath . '/' . $_ENV['WECHAT_MCH_PRIVATE_KEY_PATH'];
    //$_ENV['WECHAT_PLATFORM_PUBLIC_KEY_PATH'] = 'file://' . $rootPath . '/' . $_ENV['WECHAT_PLATFORM_PUBLIC_KEY_PATH'];
    $_ENV['WECHAT_MCH_PRIVATE_KEY_FILE'] = $rootPath . '/' . $_ENV['WECHAT_MCH_PRIVATE_KEY_FILE'];
    $_ENV['WECHAT_MCH_CERTIFICATE_FILE'] = $rootPath . '/' . $_ENV['WECHAT_MCH_CERTIFICATE_FILE'];
    
    // 初始化 Phalcon Dependency Injection
    $di = new FactoryDefault();
    $di->offsetSet('rootPath', function () use ($rootPath) {
        return $rootPath;
    });
    
    // 注册 Providers
    $providers = $rootPath . '/config/providers.php';
    if (!file_exists($providers) || !is_readable($providers)) {
        throw new Exception('File providers.php file not found or not readable');
    }
    $providers = include_once $providers;
    foreach ($providers as $provider) {
        $di->register(new $provider());
    }
    
    $handle = (new Application($di))->handle($_SERVER['REQUEST_URI']);
    if ($handle) {
        $handle->send();
    }
} catch (Exception $e) {
    echo $e->getMessage() . '<br>';
    echo nl2br($e->getTraceAsString());
}