<?php

namespace SHServ;

class EventsHandlers{
	public function handlers(){
		events() -> handler('kernel:Bootstrap.ready_app', function(Array $params) {
			app() -> routes -> routes_init();
			if(!app() -> console_flag) {
				app() -> router -> start_routing();
			}
		});

		events() -> handler('kernel:CallControl.no_calls', function(Array $params) {
			if(app() -> console_flag) {
				return;
			}

			$uri = $_SERVER['REQUEST_URI'] ?? '';
			if(strpos($uri, '?') !== false) {
				list($uri) = explode('?', $uri);
			}

			$root = app() -> root_folder() . '/webclient/dist';
			$filePath = $root . $uri;

			if(
				(str_starts_with($uri, '/assets/') || $uri === '/favicon.ico')
				&& file_exists($filePath)
				&& is_file($filePath)
			) {
				$ext = pathinfo($filePath, PATHINFO_EXTENSION);
				$mimeTypes = [
					'js'    => 'application/javascript',
					'css'   => 'text/css',
					'png'   => 'image/png',
					'jpg'   => 'image/jpeg',
					'jpeg'  => 'image/jpeg',
					'gif'   => 'image/gif',
					'svg'   => 'image/svg+xml',
					'woff'  => 'font/woff',
					'woff2' => 'font/woff2',
					'ttf'   => 'font/ttf',
					'eot'   => 'application/vnd.ms-fontobject',
					'ico'   => 'image/x-icon',
					'json'  => 'application/json',
					'map'   => 'application/json',
				];
				header('Content-Type: ' . ($mimeTypes[$ext] ?? 'application/octet-stream'));
				header('Cache-Control: public, max-age=31536000, immutable');
				readfile($filePath);
				return;
			}

			http_response_code(404);
			echo "404 not found";
		});

		events() -> handler('app:online', function(Array $params) {
			$device = $params["device"];
			$data = $params["data"];
			$device -> device_ip = $data["device_ip"];
			$device -> connection_status = "active";
			$device -> update();
		});

		if(FCONF["devmode"]) {
			events() -> handler("module:Template.start_making", function(Array $params) {
				app() -> devtools -> add_template_to_map(
					$params["template_instance"],
					$params["template_name"]
				);
			});

			events() -> handler("module:Template.ready_template", function(Array $params) {
				app() -> devtools -> render_template_done(
					$params["template_name"]
				);
			});

			events() -> handler("kernel:CallControl.leading_call", function(Array $params) {
				app() -> devtools -> loging_action_call(
					is_string($params["action"]) ? $params["action"] : "anon",
					$params["type"],
					$params["params"]
				);
			});

			events() -> handler("kernel:CallControl.completed_call", function(Array $params) {
				app() -> devtools -> loging_action_time();
			});

			events() -> handler("kernel:Bootstrap.app_finished", function(Array $params){
				if(isset($_GET["devp"])) {
					app() -> devtools -> show();
				}
			});

			events() -> handler("module:ThinBuilder.ready_sql", function(Array $params){
				app() -> devtools -> loging_sql_query($params["sql"]);
			});

			events() -> handler("module:ThinBuilder.query", function(Array $params){
				app() -> devtools -> loging_sql_query_result();
			});
		}
	}
}
