<?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
 */

/**
 * Throws an exception when called.
 *
 * @throws \Exception when called
 * @param string $message The error message
 * @param int $code The HTTP error code
 * @link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes List of HTTP
 * status codes
 */
function returnError($message, $code)
{
    throw new \Exception($message, $code);
}

/**
 * Returns HTTP Error 400 (Bad Request) when called.
 *
 * @param string $message The error message
 */
function returnClientError($message)
{
    returnError($message, 400);
}

/**
 * Returns HTTP Error 500 (Internal Server Error) when called.
 *
 * @param string $message The error message
 */
function returnServerError($message)
{
    returnError($message, 500);
}

/**
 * Stores bridge-specific errors in a cache file.
 *
 * @param string $bridgeName The name of the bridge that failed.
 * @param int $code The error code
 *
 * @return int The total number the same error has appeared
 */
function logBridgeError($bridgeName, $code)
{
    $cacheFactory = new CacheFactory();

    $cache = $cacheFactory->create();
    $cache->setScope('error_reporting');
    $cache->setkey($bridgeName . '_' . $code);
    $cache->purgeCache(86400); // 24 hours

    if ($report = $cache->loadData()) {
        $report = json_decode($report, true);
        $report['time'] = time();
        $report['count']++;
    } else {
        $report = [
            'error' => $code,
            'time' => time(),
            'count' => 1,
        ];
    }

    $cache->saveData(json_encode($report));

    return $report['count'];
}

function create_sane_stacktrace(\Throwable $e): array
{
    $frames = array_reverse($e->getTrace());
    $frames[] = [
        'file' => $e->getFile(),
        'line' => $e->getLine(),
    ];
    $stackTrace = [];
    foreach ($frames as $i => $frame) {
        $file = $frame['file'] ?? '(no file)';
        $line = $frame['line'] ?? '(no line)';
        $stackTrace[] = sprintf(
            '#%s %s:%s',
            $i,
            trim_path_prefix($file),
            $line,
        );
    }
    return $stackTrace;
}

/**
 * Trim path prefix for privacy/security reasons
 *
 * Example: "/var/www/rss-bridge/index.php" => "index.php"
 */
function trim_path_prefix(string $filePath): string
{
    return mb_substr($filePath, mb_strlen(dirname(__DIR__)) + 1);
}