<?php

use Site\App;
use Pimple\Container;
use Site\Db;
use Site\Helper;
use Site\Models\Language;
use Site\Register;
use Site\Translator;
use League\Plates\Engine;

require __DIR__ . '/vendor/autoload.php';
date_default_timezone_set('Asia/Shanghai');

try {
    Dotenv\Dotenv::createImmutable(__DIR__)->load();
    $config = require __DIR__ . '/config/config.php';

    if (isset($_ENV['DEBUG']) && $_ENV['DEBUG']) {
        error_reporting(E_ALL);
        $logFile = $config['logs'] . '/' . date('Ym') . '.log';
        if (! file_exists($logFile)) {
            if (! touch($logFile)) {
                throw new Exception('Log file creation failed, please check permissions');
            }
            if (! chmod($logFile, 0777)) {
                throw new Exception('Log file permissions update failed');
            }
        }
        ini_set('log_errors', 'On');
        ini_set('error_log', $logFile);
        ini_set('display_errors', 'On');
        ini_set('display_startup_errors', 'On');
    } else {
        error_reporting(0);
        ini_set('log_errors', 'Off');
        ini_set('display_errors', 'Off');
        ini_set('display_startup_errors', 'Off');
    }

    $container = new Container();
    $app       = new App($container);

    $container['config'] = function ($c) {
        return require __DIR__ . '/config/config.php';
    };
    $container['pdo']    = function ($c) {
        return Helper::getPdo($c['config']['db']);
    };
    $container['db']     = function ($c) {
        return new Db($c['pdo']);
    };
    $uri = $_SERVER['REQUEST_URI'];
    $uri = str_replace($_ENV['SUB_DIR'], '', $uri);
    if (false !== $pos = strpos($uri, '?')) {
        $uri = substr($uri, 0, $pos);
    }
    $uri         = ltrim(rawurldecode($uri), '/');
    $parts       = explode('/', $uri);
    $currentLang = $container['config'] ['lang']['defaultLang'];
    if (! empty($parts)) {
        $paramLang = Helper::languageId($parts[0]);
        if (array_key_exists($paramLang, $container['config'] ['lang']['languages'])) {
            $currentLang = $paramLang;
            unset($parts[0]);
        }
    }
    $container['currentLang'] = $currentLang;
    $container['uri']         = '/' . implode('/', $parts);
    $container['view']        = function ($c) {
        return new Engine($c['config']['theme_path'] . '/views');
    };

    $dispatcher = FastRoute\simpleDispatcher($container['config'] ['routes']);
    $routeInfo  = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'], $container['uri']);
    Register::set('container', $container);

    $container['system'] = setting('system');
    $langModel           = new Language();
    $messages            = $langModel->findAll();
    $container['t']      = new Translator($messages);

    session_start();

    switch ($routeInfo[0]) {
        case FastRoute\Dispatcher::NOT_FOUND:
            echo '404';
            http_response_code(404);
            break;
        case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
            $allowedMethods = $routeInfo[1];
            echo '405';
            http_response_code(405);
            break;
        case FastRoute\Dispatcher::FOUND:
            $action = App::actionFactory($routeInfo[1], ['view' => $app->get('view'), 'lang' => $container['currentLang']]);
            call_user_func_array($action, $routeInfo[2]);
            break;
    }
} catch (Throwable $e) {
    http_response_code(500);
    // echo $e->getFile();
    // echo $e->getLine();
    echo $e->getMessage();
}
