<?php

/**
 * class Settings
 *
 * Handles editing and fetching jilo configuration.
 */
class Settings {

    /**
     * Loads javascript file the Jitsi server.
     *
     * @param string $jitsiUrl The base URL of the Jitsi server.
     * @param string $livejsFile The name of the remote js file to load.
     * @param bool $raw Whether to return the full file (true) or only uncommented values (false).
     *
     * @return string The content of the interface_config.js file or an error message.
     */
    public function getPlatformJsFile($jitsiUrl, $livejsFile, $raw = false) {
        // constructing the URL
        $jsFile = $jitsiUrl . '/' . $livejsFile;

        // default content, if we can't get the file contents
        $jsFileContent = "The file $livejsFile can't be loaded.";

        // Check if URL is valid
        if (!filter_var($jsFile, FILTER_VALIDATE_URL)) {
            return "Invalid URL: $jsFile";
        }

        // ssl options
        $contextOptions = [
            'ssl' => [
                'verify_peer'		=> true,
                'verify_peer_name'	=> true,
            ],
        ];
        $context = stream_context_create($contextOptions);

        // Try to get headers first to check if file exists and wasn't redirected
        $headers = @get_headers($jsFile, 1);  // 1 to get headers as array
        if ($headers === false) {
            return "The file $livejsFile can't be loaded (connection error).";
        }

        // Check for redirects
        $statusLine = $headers[0];
        if (strpos($statusLine, '301') !== false || strpos($statusLine, '302') !== false) {
            return "The file $livejsFile was redirected - this might indicate the file doesn't exist.";
        }

        // Check if we got 200 OK
        if (strpos($statusLine, '200') === false) {
            return "The file $livejsFile can't be loaded (HTTP error: $statusLine).";
        }

        // Check content type
        $contentType = isset($headers['Content-Type']) ? $headers['Content-Type'] : '';
        if (is_array($contentType)) {
            $contentType = end($contentType); // get last content-type in case of redirects
        }
        if (stripos($contentType, 'javascript') === false && stripos($contentType, 'text/plain') === false) {
            return "The file $livejsFile doesn't appear to be a JavaScript file (got $contentType).";
        }

        // get the file
        $fileContent = @file_get_contents($jsFile, false, $context);

        if ($fileContent !== false) {
            // Quick validation of content
            $firstLine = strtolower(trim(substr($fileContent, 0, 100)));
            if (strpos($firstLine, '<!doctype html>') !== false || 
                strpos($firstLine, '<html') !== false || 
                strpos($firstLine, '<?xml') !== false) {
                return "The file $livejsFile appears to be HTML/XML content instead of JavaScript.";
            }

            // when we need only uncommented values
            if ($raw === false) {
                // remove block comments
                $jsFileContent = preg_replace('!/\*.*?\*/!s', '', $fileContent);
                // remove single-line comments
                $jsFileContent = preg_replace('/\/\/[^\n]*/', '', $jsFileContent);
                // remove empty lines
                $jsFileContent = preg_replace('/^\s*[\r\n]/m', '', $jsFileContent);

            // when we need the full file as it is
            } else {
                $jsFileContent = $fileContent;
            }
        }

        return $jsFileContent;

    }

}

?>