<?php

/**
 * This file is part of RSS-Bridge, a PHP project capable of generating RSS and
 * Atom feeds for websites that don't have one.
 *
 * For the full license information, please view the UNLICENSE file distributed
 * with this source code.
 *
 * @package Core
 * @license http://unlicense.org/ UNLICENSE
 * @link    https://github.com/rss-bridge/rss-bridge
 */

/**
 * A generator class for the home page of RSS-Bridge.
 *
 * This class generates the HTML content for displaying all bridges on the home
 * page of RSS-Bridge.
 *
 * @todo Return error if a caller creates an object of this class.
 */
final class BridgeList
{
    /**
     * Create the entire home page
     *
     * @param bool $showInactive Inactive bridges are displayed on the home page,
     * if enabled.
     * @return string The home page
     */
    public static function create($showInactive = true)
    {
        $totalBridges = 0;
        $totalActiveBridges = 0;

        return '<!DOCTYPE html><html lang="en">'
            . BridgeList::getHead()
            . '<body onload="search()">'
            . BridgeList::getHeader()
            . BridgeList::getSearchbar()
            . BridgeList::getBridges($showInactive, $totalBridges, $totalActiveBridges)
            . BridgeList::getFooter($totalBridges, $totalActiveBridges, $showInactive)
            . '</body></html>';
    }

    /**
     * Get the document head
     *
     * @return string The document head
     */
    private static function getHead()
    {
        return <<<EOD
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<meta name="description" content="RSS-Bridge" />
	<title>RSS-Bridge</title>
	<link href="static/style.css" rel="stylesheet">
	<link rel="icon" type="image/png" href="static/favicon.png">
	<script src="static/search.js"></script>
	<script src="static/select.js"></script>
	<noscript>
		<style>
			.searchbar {
				display: none;
			}
		</style>
	</noscript>
</head>
EOD;
    }

    /**
     * Get the document body for all bridge cards
     *
     * @param bool $showInactive Inactive bridges are visible on the home page if
     * enabled.
     * @param int $totalBridges (ref) Returns the total number of bridges.
     * @param int $totalActiveBridges (ref) Returns the number of active bridges.
     * @return string The document body for all bridge cards.
     */
    private static function getBridges($showInactive, &$totalBridges, &$totalActiveBridges)
    {
        $body = '';
        $totalActiveBridges = 0;
        $inactiveBridges = '';

        $bridgeFactory = new BridgeFactory();
        $bridgeClassNames = $bridgeFactory->getBridgeClassNames();

        $formatFactory = new FormatFactory();
        $formats = $formatFactory->getFormatNames();

        $totalBridges = count($bridgeClassNames);

        foreach ($bridgeClassNames as $bridgeClassName) {
            if ($bridgeFactory->isWhitelisted($bridgeClassName)) {
                $body .= BridgeCard::displayBridgeCard($bridgeClassName, $formats);
                $totalActiveBridges++;
            } elseif ($showInactive) {
                // inactive bridges
                $inactiveBridges .= BridgeCard::displayBridgeCard($bridgeClassName, $formats, false) . PHP_EOL;
            }
        }

        $body .= $inactiveBridges;

        return $body;
    }

    /**
     * Get the document header
     *
     * @return string The document header
     */
    private static function getHeader()
    {
        $warning = '';

        if (Debug::isEnabled()) {
            if (!Debug::isSecure()) {
                $warning .= <<<EOD
<section class="critical-warning">Warning : Debug mode is active from any location,
 make sure only you can access RSS-Bridge.</section>
EOD;
            } else {
                $warning .= <<<EOD
<section class="warning">Warning : Debug mode is active from your IP address,
 your requests will bypass the cache.</section>
EOD;
            }
        }

        return <<<EOD
<header>
	<div class="logo"></div>
	{$warning}
</header>
EOD;
    }

    /**
     * Get the searchbar
     *
     * @return string The searchbar
     */
    private static function getSearchbar()
    {
        $query = filter_input(INPUT_GET, 'q', \FILTER_SANITIZE_SPECIAL_CHARS);

        return <<<EOD
<section class="searchbar">
	<h3>Search</h3>
	<input type="text" name="searchfield"
		id="searchfield" placeholder="Insert URL or bridge name"
		onchange="search()" onkeyup="search()" value="{$query}">
</section>
EOD;
    }

    /**
     * Get the document footer
     *
     * @param int $totalBridges The total number of bridges, shown in the footer
     * @param int $totalActiveBridges The total number of active bridges, shown
     * in the footer.
     * @param bool $showInactive Sets the 'Show active'/'Show inactive' text in
     * the footer.
     * @return string The document footer
     */
    private static function getFooter($totalBridges, $totalActiveBridges, $showInactive)
    {
        $version = Configuration::getVersion();

        $email = Configuration::getConfig('admin', 'email');
        $admininfo = '';
        if (!empty($email)) {
            $admininfo = <<<EOD
<br />
<span>
   You may email the administrator of this RSS-Bridge instance
   at <a href="mailto:{$email}">{$email}</a>
</span>
EOD;
        }

        $inactive = '';

        if ($totalActiveBridges !== $totalBridges) {
            if ($showInactive) {
                $inactive = '<a href="?show_inactive=0"><button class="small">Hide inactive bridges</button></a><br>';
            } else {
                $inactive = '<a href="?show_inactive=1"><button class="small">Show inactive bridges</button></a><br>';
            }
        }

        return <<<EOD
<section class="footer">
	<a href="https://github.com/rss-bridge/rss-bridge">RSS-Bridge ~ Public Domain</a><br>
	<p class="version">{$version}</p>
	{$totalActiveBridges}/{$totalBridges} active bridges.<br>
	{$inactive}
	{$admininfo}
</section>
EOD;
    }
}