<?
use Core\Modules\Utils\Controller\MinController;
use Phalcon\Di\Di;
use Phalcon\Mvc\Model;
use Phalcon\Mvc\Dispatcher as MvcDispatcher;
use \Phalcon\Mvc\Dispatcher as PhDispatcher;

// SET GLOBAL sql_mode = "NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES"
Model::setup(
    array(
        'notNullValidations' => false
    )
);

mb_internal_encoding("UTF-8");

set_time_limit (0);
ini_set('display_errors', 1);
error_reporting(E_ALL /*^ 'E_DEPRECATED'*/ );
date_default_timezone_set( 'Europe/Moscow' );

(new Phalcon\Support\Debug())->listen(true, true);

require_once('../Core/Lib/Vendor/autoload.php');

try {
	$Loader = new Phalcon\Autoload\Loader();

	$Loader->setNamespaces(
		[
			'Core\Lib'        => '../Core/Lib/',
            'Core\Lib\Navigation' => '../Core/Lib/Navigation/',
			'Core\Controller' => '../Core/Controller/',
            'Core\Extenders'  => '../Core/Extenders/',
            'Core\Model'      => '../Core/Model/'
		],
		true
	)->register();

	$DI = new Phalcon\Di\FactoryDefault();


    $DI->get('dispatcher')->setEventsManager($DI->get('eventsManager'));

    $DI->set('url', function() {
        $url = new \Phalcon\Url();
        $url->setBaseUri('/');

        return $url;
    }, true);

	$DI->setShared('debug', 'Core\Lib\Debug')->resolve();


	$App = new Phalcon\Mvc\Application($DI);

	$DI->setShared('loader', $Loader);

    $DI->setShared('overseer', function () {
        return Core\Lib\Overseer::getInstance();
    });

    $DI->setShared('og', function () {
        return Core\Lib\OpenGraph::getInstance();
    });

    $DI->setShared('resconf', function () {
        return Core\Lib\ResourcesConfigurator::getInstance();
    });

	$DI->setShared('hostname', function () {
		$Hostname = new Core\Lib\Hostname();
        $Hostname->setHostnameConfigDir('../Cache/Sites/');
		$Hostname->initialize();

		return $Hostname;
	})->resolve();

	$DI->getShared('debug')->resolve($DI['hostname']->config->debug);

    $DI->set('db', function() use ($DI) {
        $config = require_once('../Config/mysql.php');

        $db = new Phalcon\Db\Adapter\Pdo\Mysql(array(
            "host"     => $config['host'],
            "username" => $config['username'],
            "password" => $config['password'],
            "dbname"   => $config['name'],
            'charset'   =>'UTF8',
            'options' =>[
                PDO::ATTR_DEFAULT_FETCH_MODE  =>  PDO::FETCH_ASSOC,
                PDO::MYSQL_ATTR_INIT_COMMAND  => 'SET NAMES UTF8'
            ]
        ));

        $db->query(
            '
                SET 
                    character_set_results = \'utf8\', 
                    character_set_client = \'utf8\', 
                    character_set_connection = \'utf8\', 
                    character_set_database = \'utf8\', 
                    character_set_server = \'utf8\'
            '
        );

        return $db;
    });



    //echo '<pre>';
    //print_r($mysqli->get_charset ());



	$DI->set('modelsMetadata', function () {
		return new \Phalcon\Mvc\Model\MetaData\Stream(
			[
				'metaDataDir' => '../Cache/Metadata/'
			]
		);
	});

    $DI->set('cookies', function() {
        $Cookies = new Phalcon\Http\Response\Cookies();
        $Cookies->useEncryption(false);
        return $Cookies;
    });

    /*$DI->set('crypt', function() {
        $Crypt = new Phalcon\Crypt();
        $Crypt->setKey('KTr]t[S&gt;ATN');
        return $Crypt;
    });*/


    $DI->setShared('session', function () {
        $session = new Phalcon\Session\Manager();
        $files = new Phalcon\Session\Adapter\Stream();
        $session->setAdapter($files)->start();

        return $session;
    });


    $DI->setShared('user', function () {
		return Core\Lib\UserHandler::getInstance();
	});

	$DI->set('security', function () {
		$Security = new Core\Lib\Security();

		return $Security;
	});

	$DI->set('assets', function () use ($DI) {
		$Assets = new Phalcon\Assets\Manager(new Phalcon\Html\TagFactory(new Phalcon\Html\Escaper()));

        $js  = $Assets->collection('js');
        $css = $Assets->collection('css');

        $user = $DI['user'];

        if ($user->getSetting('tools', 'dev_compress_css')) {
            $css->addCss('/min/common_'.$DI['overseer']->getSiteName().'_css_ver'.$DI['resconf']->getVerCss().'.css');
        }
        else {
            $sysCss = (new MinController())->minCssSystemApp(true);

            foreach($sysCss as $i => $v) {
                $len = sizeof($v);

                for($a = 0; $a < $len; $a++) {
                    $css->addCss($i.$v[$a]);
                }
            }

            $configCss = $DI['hostname']->config['system']['css'];

            $name   = $DI['hostname']->config['system']['package']['name'];
            $path      = 'design/'.mb_strtolower($name).'/';

            if (sizeof($configCss)) {
                foreach($configCss as $i => $v) {
                    $css->addCss($path.$v);
                }
            }
        }

        if (false && $user->getSetting('tools', 'dev_compress_js') && $DI['hostname']->config['meta']['site_id'] != 0) {
            $js->addJs('/min/common_'.$DI['overseer']->getSiteName().'_js_ver'.$DI['resconf']->getVerJS().'_ru.js', false, false, array('async' => 'async'));
        }
        else {
            $sysJs = $DI['db']->query(
                '
                    SELECT
                        `srjg`.`group_folder`,
                        `srj`.`js_name`,
                        `srj`.`js_lang`
                    FROM `sys_resources_js` AS `srj`, `sys_resources_js_groups` AS `srjg`
                    WHERE `srjg`.`group_id`=`srj`.`group_id` AND `srj`.`js_type`=\'system\' AND `srj`.`js_skip`=0
                    ORDER BY `srjg`.`group_order` ASC, `srj`.`js_order` ASC
                '
            );

            while($row = $sysJs->fetch()) {
                if ($row['js_lang']) {
                    $js->addJs('/api/utils/builder/buildLangForJSByDirFile?file='.$row['group_folder'].$row['js_name'].'&trans='.$row['js_lang']);
                }
                else {
                    $js->addJs($row['group_folder'].$row['js_name']);
                }
            }


            $modules   = $DI['hostname']->config['system']['package']['modules'];
            $name      = $DI['hostname']->config['system']['package']['name'];
            $siteId    = $DI['hostname']->config['meta']['site_id'];
            $packageId = $DI['hostname']->config['system']['package']['id'];

            if($packageId) {
                $packageJs = $DI['db']->query('SELECT * FROM `sys_resources_js` WHERE `package_id`='.$packageId.' AND `js_type`=\'package\' ORDER BY `js_order` ASC');

                while($row = $packageJs->fetch()) {
                    if ($row['js_lang']) {
                        $js->addJs('/api/utils/builder/buildLangForJSByDirFile?file='.'js/'.$row['js_name'].'&trans='.$row['js_lang']);
                    }
                    else {
                        $js->addJs('js/'.$row['js_name']);
                    }
                }
            }



            $siteJs = $DI['db']->query('SELECT * FROM `sys_resources_js` WHERE `site_id`='.$siteId.' AND `js_type`=\'site\' ORDER BY `js_order` ASC');


            while($row = $siteJs->fetch()) {
                if ($row['js_lang']) {
                    $js->addJs('/api/utils/builder/buildLangForJSByDirFile?file='.'js/'.$row['js_name'].'&trans='.$row['js_lang']);
                }
                else {
                    $js->addJs('js/'.$row['js_name']);
                }
            }

            $js->addJs('js/packages/'.$name.'.js');

            if (sizeof($modules)) {
                foreach($modules as $i => $v) {
                    $addr = 'js/controllers/'.$name.'/'.$i.'.js';

                    if (!is_readable($addr))
                        continue;

                    $js->addJs($addr);
                }
            }

            $js->addJs('js/main.js');
        }

		return $Assets;
	});

	$DI->set('view', function () use ($DI) {
		$EventManager = new \Phalcon\Events\Manager();

//		Пример обработки события в \Core\Lib\Mustache (line 42)
//		$EventManager->attach('mustache:testEvent', function () {
//			die('WOO WOOOOOOOOOOOOOOOOOOO!!!!11');
//		});

		//$View = new Phalcon\Mvc\View();

        $View = new \Core\Extenders\MvcView();

		$View->setEventsManager($EventManager);

		$View->setViewsDir($DI['hostname']->config->view->path);
		$View->setLayoutsDir('layouts/');
		$View->setPartialsDir('partials/');
		$View->setMainView('main');

		$Engine = new Core\Lib\Mustache($View, $DI);

		$NativeEngine = new Phalcon\Mvc\View\Engine\Php($View, $DI);

		$View->registerEngines([
			'.hbs' => $Engine,
			'.phtml' => $NativeEngine
		]);

		return $View;
	});

    $html = $App->handle($_SERVER["REQUEST_URI"])->getContent();

    if ($DI['request']->isAjax()) {

        (new \Core\Lib\JSONResponse(\Core\Lib\JSONResponse::SUCCESS))->send(
            [
                'status' => 'success',
                'hapi' => [
                    'title'      => $DI['overseer']->getMetaTitle(),
                    'container'  => $DI['overseer']->getJSContainer(),
                    'package'    => $DI['overseer']->getJSPackage(),
                    'controller' => $DI['overseer']->getJSController(),
                    'action'     => $DI['overseer']->getJSAction()
                ],
                'html' => $html
            ]
        );
    }
    else
        echo $html;


    


} catch (Core\Lib\ApiException $apiException) {

	if ($DI['hostname']->config->debug->enableApi) {
		$DI['debug']->onUncaughtException($apiException);
	}

	(new Core\Lib\JSONResponse(\Core\Lib\JSONResponse::ERROR))->send($apiException);

	//$DI['response']->setHeader('Content-type', 'application/json')
	//	->setJsonContent(["status" => false, "error" => ["message" => $apiException->getMessage()]])->send();
} catch (Phalcon\Exception $e) {
	if ($DI['hostname']->config->debug->enable && !$DI['hostname']->checkMode(Core\Lib\Hostname::API_MODE)) {
		$DI['debug']->onUncaughtException($e);
	}

	echo "Error: {$e->getMessage()}<br>{$e->getFile()}:{$e->getLine()}";
}