<?php
function renderDynamicPage($page_file): array
{
    require_once $page_file;
    $page_parameters = get_parameters();
    $page_content = render();
    return ["output" => $page_content, "parameters" => $page_parameters];
}

function parsePageTag($input): array
{
    // Define the pattern for the tag
    $pattern = '/<page\s+([^>]+)><\/page>/i';

    // Check if the pattern matches the input
    if (preg_match($pattern, $input, $matches)) {
        // Extract parameters
        $parameters = [];
        if (preg_match_all('/(\w+)="([^"]+)"/', $matches[1], $paramMatches, PREG_SET_ORDER)) {
            foreach ($paramMatches as $paramMatch) {
                $parameters[$paramMatch[1]] = $paramMatch[2];
            }
        }

        // Remove the tag from the input
        $output = preg_replace($pattern, '', $input, 1);

        return ['parameters' => $parameters, 'output' => $output];
    }

    // If no match is found, return the original input
    return ['parameters' => [], 'output' => $input];
}

function getPage($page_name = null): array|false|string
{
    global $routerConfig;
    global $routerRequest;

    if(!$page_name){
        $page_name = $routerRequest["page_name"];
    }

    $dynamic_page_file = $routerConfig["page_dir"] . $routerRequest["subdomain"] . "/" . $page_name . ".php";
    $page_file = $routerConfig["page_dir"] . $routerRequest["subdomain"] . "/" . $page_name . ".html";

    $dynamic_page_file_global = $routerConfig["page_dir"] . "global/" . $page_name . ".php";
    $page_file_global = $routerConfig["page_dir"] . "global/" . $page_name . ".html";

    $skeleton = file_get_contents($routerConfig["template_dir"] . "skeleton.html");
    $nav = file_get_contents($routerConfig["template_dir"] . "nav.html");

    if (file_exists($dynamic_page_file_global)){
        $pageMetadata = renderDynamicPage($dynamic_page_file_global);
        $page = $pageMetadata["output"];

    }
    elseif (file_exists($page_file_global)){
        $page_tmp = file_get_contents($page_file_global);

        $pageMetadata = parsePageTag($page_tmp);
        $page = $pageMetadata["output"];
    }
    elseif (file_exists($dynamic_page_file)){
        $pageMetadata = renderDynamicPage($dynamic_page_file);

        $page = $pageMetadata["output"];
    }
    elseif (file_exists($page_file)){
        $page_tmp = file_get_contents($page_file);

        $pageMetadata = parsePageTag($page_tmp);
        $page = $pageMetadata["output"];
    }
    else{
        $page_tmp = file_get_contents($routerConfig["template_dir"] . "404.html");
        $pageMetadata = parsePageTag($page_tmp);
        $page = $pageMetadata["output"];
        http_response_code(404);
    }

    if(!empty($pageMetadata["parameters"]["minimal_permission_level"])){
        $page_required_permission = intval($pageMetadata["parameters"]["minimal_permission_level"]);
    }
    else{
        $page_required_permission = $routerConfig["default_page_permission_level"];
    }

    if(!empty($pageMetadata["parameters"]["secret"])){
        $origSecret = $pageMetadata["parameters"]["secret"];
        if ($origSecret == "yes"){
            $is_secret_page = 1;
        }
        elseif ($origSecret == "no"){
            $is_secret_page = 0;
        }
        else{
            $is_secret_page = $routerConfig["default_page_secret"];
        }
    }
    else{
        $is_secret_page = $routerConfig["default_page_secret"];
    }


    if($page_required_permission > $_SESSION["privilegelevel"]){
        if($is_secret_page == 1) {
            $page_tmp = file_get_contents($routerConfig["template_dir"] . "404.html");
            $pageMetadata = parsePageTag($page_tmp);
            $page = $pageMetadata["output"];
            http_response_code(404);
        }
        else{
            $page_tmp = file_get_contents($routerConfig["template_dir"] . "403.html");
            $pageMetadata = parsePageTag($page_tmp);
            $page = $pageMetadata["output"];
            http_response_code(403);
        }
    }

    if(!empty($pageMetadata["parameters"]["page_title"])){
        $page_title = $pageMetadata["parameters"]["page_title"];
    }
    else{
        $page_title = $page_name;
    }

    $site_name = $routerRequest["subdomain"];

    if(!empty($pageMetadata["parameters"]["page_style"])){
        $style_location = $pageMetadata["parameters"]["page_style"];
    }
    else{
        $style_location = "assets/styles/$site_name/$page_name.css";
    }

    if(file_exists($style_location)) {
        $style_tag = $style_location;
    }
    else{
        $style_tag = "";
    }

    if(!empty($pageMetadata["parameters"]["page_script"])){
        $script_location = $pageMetadata["parameters"]["page_script"];
    }
    else{
        $script_location = "assets/scripts/$site_name/$page_name.js";
    }

    if(file_exists($style_location)) {
        $script_tag = $script_location;
    }
    else{
        $script_tag = "";
    }


    $navpages = generateNavigation();

    $nav = str_replace("__NAV_PAGES__", $navpages, $nav);

    $out = $skeleton;
    $out = str_replace("__TEMPLATE__NAV__", $nav, $out);
    $out = str_replace("__TEMPLATE_PAGE_STYLE_TAG__", $style_tag, $out);
    $out = str_replace("__TEMPLATE_PAGE_SCRIPT_TAG__", $script_tag, $out);
    $out = str_replace("__TEMPLATE__PAGE__", $page, $out);
    return str_replace("__TEMPLATE_PAGE_TITLE__", $page_title, $out);
}