<?php

/**
 * Implements functions for debugging purposes. Debugging can be enabled by
 * placing a file named 'DEBUG' in PATH_ROOT.
 *
 * The file specifies a whitelist of IP addresses on which debug mode will be
 * enabled. An empty file enables debug mode for everyone (highly discouraged
 * for public servers!). Each line in the file specifies one client in the
 * whitelist. For example:
 *
 * 192.168.1.72
 * 127.0.0.1
 * ::1
 *
 * Notice: If you are running RSS-Bridge on your local machine, you need to add
 * localhost (either 127.0.0.1 for IPv4 or ::1 for IPv6) to your whitelist!
 *
 * Warning: In debug mode your server may display sensitive information! For
 * security reasons it is recommended to whitelist only specific IP addresses.
 */
class Debug {

	/**
	 * Indicates if debug mode is enabled.
	 * Use Debug::isEnabled() instead of accessing this parameter directly!
	 */
	private static $enabled = false;

	/**
	 * Indicates if debug mode is secure (not enabled for everyone).
	 * Use Debug::isSecure() instead of accessing this parameter directly!
	 */
	private static $secure = false;

	/**
	 * @return bool Indicates if debug mode is enabled
	 */
	public static function isEnabled() {
		static $firstCall = true; // Initialized on first call

		if($firstCall && file_exists(PATH_ROOT . 'DEBUG')) {

			$debug_whitelist = trim(file_get_contents(PATH_ROOT . 'DEBUG'));

			Debug::$enabled = empty($debug_whitelist) || in_array($_SERVER['REMOTE_ADDR'],
					explode("\n", str_replace("\r", '', $debug_whitelist)
				)
			);

			if(Debug::$enabled) {
				ini_set('display_errors', '1');
				error_reporting(E_ALL);

				Debug::$secure = !empty($debug_whitelist);
			}

			$firstCall = false; // Skip check on next call

		}

		return Debug::$enabled;
	}

	/**
	 * Returns true if debug mode has been enabled for specific IP addresses
	 * only, false otherwise.
	 *
	 * Notice: The security flag is set by Debug::isEnabled(). If this function
	 * is called before Debug::isEnabled(), the default value is false!
	 *
	 * @return bool Indicates if debug mode is secure
	 */
	public static function isSecure() {
		return Debug::$secure;
	}

	/**
	 * Adds a debug message to error_log if debug mode is enabled
	 */
	public static function log($text) {
		if(!Debug::isEnabled()) {
			return;
		}

		$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
		$calling = $backtrace[2];
		$message = $calling['file'] . ':'
			. $calling['line'] . ' class '
			. (isset($calling['class']) ? $calling['class'] : '<no-class>') . '->'
			. $calling['function'] . ' - '
			. $text;

		error_log($message);
	}
}