<?PHP
/**
 * File for collecting functions building common HTML parts of the public page
 *
 * @file
 *
 * @author Joshua Ramon Enslin <joshua@jrenslin.de>
 */

/**
 * Prints the head element of an HTML page in the public frontend.
 *
 * @param array  $settings   Settings variable.
 * @param string $page       ID of the current page.
 * @param string $title      Title of the page.
 * @param string $icon       The icon of the website.
 * @param string $additional Additional HTML to inject.
 *
 * @return string
 */
function printPublicHead(array $settings, string $page = "home", string $title = "Home", string $icon = "", $additional = ""):string {

    $output = '<!DOCTYPE html>
<html lang="' . $settings['defaultLang'] . '" id="' . $page . '">
<head>

    <!-- Content Security policies -->
    <meta http-equiv="Content-Security-Policy" content="default-src \'none\'; script-src \'self\'; connect-src \'self\' ' . $settings['mdVersion'] . '; img-src \'self\' ' . $settings['mdVersion'];
    if ($settings['CSPimageSources']) $output .= " " . $settings['CSPimageSources']; // Allow embedding of whitelisted images.
    $output .= '; style-src \'self\' \'unsafe-inline\'; font-src \'self\'; frame-src \'self\'';
    if ($settings['CSPobjectSources']) $output .= " " . $settings['CSPobjectSources']; // Allow embedding of whitelisted frame contents / objects.
    $output .= '; object-src \'self\'';
    if ($settings['CSPobjectSources']) $output .= " " . $settings['CSPobjectSources']; // Allow embedding of whitelisted frame contents / objects.
    $output .= '; frame-ancestors \'self\'; base-uri \'none\'; form-action \'self\';" />

	<title>' . $title . '</title>
    <link rel="stylesheet" type="text/css" href="themes/imports.css" />
    <link rel="stylesheet" type="text/css" href="themes/' . $settings['css'] . '/theme.css" />
    <link rel="manifest" href="./manifest.php">
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />';

    $output .= $additional;

    if ($icon) {
        $output .= '
    <link rel="shortcut icon" href="' . $icon . '" />
    ';
    }

    $output .= '
    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <script type="text/javascript" src="./js/main.js"></script>
    <script type="text/javascript" src="./js/mdCalendar.js" defer></script>

</head>
<body>
';

    if (isset($_SESSION['editHistory'])) {
        $output .= "<p class='editLine ".$_SESSION['editHistory'][0]."'>".$_SESSION['editHistory'][1]."</p>";
        unset($_SESSION['editHistory']);
    }

    return $output;

}

/**
 * Prints the header element of an HTML page.
 *
 * @param string $title Title of the page.
 *
 * @return string
 */
function printPublicHeader(string $title = "Home"):string {

    $output = '

    <header id="mainHeader">

        <h1>' . $title . '</h1>

        ' . generateSearchBar() . '

    </header>
    ';

    return $output;

}

/**
 * Prints the finishing elements of public HTML pages.
 *
 * @return string
 */
function printPublicEnd():string {

    $output = '
</body>
</html>';

    return $output;

}

/**
 * This function prints a file (the sidebar, the banner, or the footer) if it is not empty.
 *
 * @param string $file File name. Must be either aside, banner or footer.
 * @param string $elem Encapsulating HTML element.
 *
 * @return string
 */
function printStaticPagePart(string $file, string $elem):string {

    if (!in_array($file, ['footer', 'aside', 'banner', 'welcomeMsg'])) {
        echo "Trying to access disallowed file.";
    }

    if (!file_exists(__DIR__ . "/../data/$file.htm") || !filesize(__DIR__ . "/../data/$file.htm") > 5) return "";
    $content = file_get_contents(__DIR__ . "/../data/$file.htm");

    $output = "
    <$elem>
        $content
    </$elem>";

    return $output;

}

/**
 * This function prints an error page.
 *
 * @param string $content The error message.
 *
 * @return string
 */
function printErrorPage(string $content):string {

    $output = '
<!DOCTYPE html>
<html id="errorPage">
    <head>
        <meta http-equiv="Content-Security-Policy" content="default-src \'none\'; script-src \'none\'; connect-src \'none\'; style-src \'self\'; font-src \'self\';" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <meta charset="UTF-8" />
        <title>' . $content . '</title>
        <link rel="stylesheet" type="text/css" href="themes/default/default.css" />
    </head>
    <body>

        <div>
            ' . $content . '
        <div>

    </body>
</html>

';

    return $output;

}

/**
 * Function for generating the standard navigation of the public parts of the page.
 *
 * @param array $pages List of all pages.
 *
 * @return string
 */
function generatePublicNav($pages):string {
    $output  = '<nav>';
    $output .= buildPageOrder(
        $pages,
        function() {
            return "<ul>";
        },
        function() {
            return "</ul>";
        },
        function($inputs, string $toAdd) {
            $output = "
            <li";
            if (!$inputs['public']) $output .= " class='notPublic'";
            $output .= ">
                <a href='./?id=" . $inputs['id'] . "'>" . $inputs['title'] . "</a>
                $toAdd
            </li>
            ";
            return $output;
        }
    );
    $output .= '</nav>';
    return $output;
}

/**
 * Function for printing the search bar.
 *
 * @return string
 */
function generateSearchBar():string {

    $output = '
    <form action="search.php" method="GET">
        <input type="search" name="q" />
    </form>
    ';

    return $output;

}

?>