<?php

declare(strict_types=1);

namespace ${REPO_OWNER}\${REPO_NAME}\controllers;

// Files of the project
use ${REPO_OWNER}\${REPO_NAME}\views\manager,
	${REPO_OWNER}\${REPO_NAME}\models\core as models,
	${REPO_OWNER}\${REPO_NAME}\models\session;

// Framework for PHP
use mirzaev\minimal\core as minimal,
	mirzaev\minimal\controller,
	mirzaev\minimal\http\response,
	mirzaev\minimal\http\enumerations\status;

/**
 * Controllers core
 *
 * @package ${REPO_OWNER}\${REPO_NAME}\controllers
 *
 * @param session $$session Instance of the session
 * @param language $$language Language
 * @param response $$response Response
 * @param array $$errors Registry of errors
 *
 * @method void __construct(minimal $$minimal, bool $$initialize) Constructor
 *
 * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
 * @author ${REPO_OWNER} <mail@domain.zone>
 */
class core extends controller
{
	/**
	 * Session
	 * 
	 * @var session|null $$session Instance of the session
	 */
	protected readonly session $$session;

	/**
	 * Language
	 *
	 * @var language $$language Language
	 */
	protected language $$language = language::en;

	/**
	 * Response
	 *
	 * @see https://wiki.php.net/rfc/property-hooks (find a table about backed and virtual hooks)
	 *
	 * @var response $$response Response
	 */
	protected response $$response {
		// Read
		get => $$this->response ??= $$this->request->response();
	}

	/**
	 * Errors
	 *
	 * @var array $$errors Registry of errors
	 */
	protected array $$errors = [
		'session' => [],
		'account' => []
	];

	/**
	 * Constructor
	 *
	 * @param minimal $$minimal Instance of the MINIMAL
	 * @param bool $$initialize Initialize a controller?
	 *
	 * @return void
	 */
	public function __construct(minimal $$minimal, bool $$initialize = true)
	{
		// Blocking requests from CloudFlare (better to write this blocking into nginx config file)
		if (isset($$_SERVER['HTTP_USER_AGENT']) && $$_SERVER['HTTP_USER_AGENT'] === 'nginx-ssl early hints') return status::bruh->label;

		// For the extends system
		parent::__construct(core: $$minimal);

		if ($$initialize) {
			// Requestet initializing

			// Initializing core of the models
			new models();

			// Initializing of the date until which the session will be active
			$$expires = strtotime('+1 week');

			// Initializing of default value of hash of the session
			$$_COOKIE["session"] ??= null;

			// Initializing of session
			$$this->session = new session($$_COOKIE["session"], $$expires, $$this->errors['session']);

			// Handle a problems with initializing a session
			if (!empty($$this->errors['session'])) die;
			else if ($$_COOKIE["session"] !== $$this->session->hash) {
				// Hash of the session is changed (implies that the session has expired and recreated)

				// Write a new hash of the session to cookies
				setcookie(
					'session',
					$$this->session->hash,
					[
						'expires' => $$expires,
						'path' => '/',
						'secure' => true,
						'httponly' => true,
						'samesite' => 'strict'
					]
				);
			}

			// Initializing of preprocessor of views
			$$this->view = new templater($$this->session);
		}
	}
}