<?php

declare(strict_types=1);

namespace mirzaev\site\mirzaev\controllers;

// Файлы проекта
use mirzaev\site\mirzaev\views\manager;
use mirzaev\site\mirzaev\models\core as models;
use mirzaev\site\mirzaev\models\account_model as account;
use mirzaev\site\mirzaev\models\session_model as session;

// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;

// Фреймворк PHP
use mirzaev\minimal\controller;

// Фреймворк ВКонтакте
use mirzaev\vk\core as vk;
use mirzaev\vk\robots\user as robot;

/**
 * Ядро контроллеров
 *
 * @package mirzaev\site\mirzaev\controllers
 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 */
class core extends controller
{
    /**
     * Переменные окружения
     */
    protected robot $vk;

    /**
     * Переменные окружения
     */
    protected array $variables = [];

    /**
     * Конструктор
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();

        // Инициализация ядра моделей (соединение с базой данных...)
        new models();

        // Инициализация журнала ошибок
        $this->variables['errors'] = [
            'session' => [],
            'account' => [],
            'vk' => []
        ];

        // Инициализация даты до которой будет активна сессия
        $expires = time() + 604800;

        // Инициализация сессии (без журналирования)
        $this->variables['session'] = session::initialization($_COOKIE["session"] ?? null, $expires) ?? header('Location: https://mirzaev.sexy/error?code=500&text=Не+удалось+инициализировать+сессию');

        if ($_COOKIE["session"] ?? null !== $this->variables['session']->hash) {
            // Изменился хеш сессии (подразумевается, что сессия устарела)

            // Запись хеша новой сессии
            setcookie('session', $this->variables['session']->hash, [
                'expires' => $expires,
                'domain' => 'mirzaev.sexy',
                'path' => '/',
                'secure' => true,
                'httponly' => true,
                'samesite' => 'strict'
            ]);
        }

        // Инициализация аккаунта (без журналирования)
        $this->variables['account'] = session::account($this->variables['session']);

        if ($this->variables['account'] instanceof _document) {
            // Инициализирован аккаунт

            // Инициализация аккаунта ВКонтакте (без журналирования)
            $this->variables['vk'] = account::vk($this->variables['account']);

            if ($this->variables['vk'] instanceof _document) {
                // Инициализирован аккаунт ВКонтакте

                // Инициализация робота для аккаунта ВКонтакте
                $this->vk = vk::init()->user(key: $this->variables['vk']->access['key']);
            } else unset($this->variables['account'], $this->variables['vk']);
        }

        // Инициализация препроцессора представления
        $this->view = new manager;
    }
}
