<?php $error_id = uniqid('error', true); ?>
<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="robots" content="noindex">

    <title><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?></title>
    <style type="text/css">
        <?= preg_replace(
            '#[\r\n\t ]+#',
            ' ',
            file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')
        ) ?>
    </style>

    <script type="text/javascript">
        <?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?>
    </script>
</head>

<body onload="init()">

    <!-- Header -->
    <div class="header">
        <div class="container">
            <h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'),
                $exception->getCode()
                    ? ' #' . $exception->getCode()
                    : '' ?></h1>
            <p>
                <?= $exception->getMessage() ?>
                <a href="https://www.google.com/search?q=<?= urlencode(
                    $title .
                        ' ' .
                        preg_replace(
                            '#\'.*\'|".*"#Us',
                            '',
                            $exception->getMessage()
                        )
                ) ?>" rel="noreferrer" target="_blank">search &rarr;</a>
            </p>
        </div>
    </div>

    <!-- Source -->
    <div class="container">
        <p><b><?= static::cleanPath(
            $file,
            $line
        ) ?></b> at line <b><?= $line ?></b></p>

        <?php if (is_file($file)): ?>
            <div class="source">
                <?= static::highlightFile($file, $line, 15) ?>
            </div>
        <?php endif; ?>
    </div>

    <div class="container">

        <ul class="tabs" id="tabs">
            <li><a href="#backtrace">Backtrace</a></li>
            <li><a href="#server">Server</a></li>
            <li><a href="#request">Request</a></li>
            <li><a href="#response">Response</a></li>
            <li><a href="#files">Files</a></li>
            <li><a href="#memory">Memory</a></li>
            </li>
        </ul>

        <div class="tab-content">

            <!-- Backtrace -->
            <div class="content" id="backtrace">

                <ol class="trace">
                    <?php foreach ($trace as $index => $row): ?>
                        <li>
                            <p>
                                <!-- Trace info -->
                                <?php if (
                                    isset($row['file']) &&
                                    is_file($row['file'])
                                ): ?>
                                    <?php if (
                                        isset($row['function']) &&
                                        in_array($row['function'], [
                                            'include',
                                            'include_once',
                                            'require',
                                            'require_once',
                                        ])
                                    ) {
                                        echo $row['function'] .
                                            ' ' .
                                            static::cleanPath($row['file']);
                                    } else {
                                        echo static::cleanPath($row['file']) .
                                            ' : ' .
                                            $row['line'];
                                    } ?>
                                <?php else: ?>
                                    {PHP internal code}
                                <?php endif; ?>

                                <!-- Class/Method -->
                                <?php if (isset($row['class'])): ?>
                                    &nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= $row[
                                        'class'
                                    ] .
                                        $row['type'] .
                                        $row['function'] ?>
                                    <?php if (!empty($row['args'])): ?>
                                        <?php $args_id =
                                            $error_id . 'args' . $index; ?>
                                        ( <a href="#" onclick="return toggle('<?= $args_id ?>');">arguments</a> )
                                        <div class="args" id="<?= $args_id ?>">
                                            <table cellspacing="0">

                                                <?php
                                                $params = null;
                                                // Reflection by name is not available for closure function
                                                if (
                                                    substr(
                                                        $row['function'],
                                                        -1
                                                    ) !== '}'
                                                ) {
                                                    $mirror = isset(
                                                        $row['class']
                                                    )
                                                        ? new \ReflectionMethod(
                                                            $row['class'],
                                                            $row['function']
                                                        )
                                                        : new \ReflectionFunction(
                                                            $row['function']
                                                        );
                                                    $params = $mirror->getParameters();
                                                }
                                                foreach (
                                                    $row['args']
                                                    as $key => $value
                                                ): ?>
                                                    <tr>
                                                        <td><code><?= htmlspecialchars(
                                                            isset($params[$key])
                                                                ? '$' .
                                                                    $params[
                                                                        $key
                                                                    ]->name
                                                                : "#$key",
                                                            ENT_SUBSTITUTE,
                                                            'UTF-8'
                                                        ) ?></code></td>
                                                        <td>
                                                            <pre><?= print_r(
                                                                $value,
                                                                true
                                                            ) ?></pre>
                                                        </td>
                                                    </tr>
                                                <?php endforeach;
                                                ?>

                                            </table>
                                        </div>
                                    <?php else: ?>
                                        ()
                                    <?php endif; ?>
                                <?php endif; ?>

                                <?php if (
                                    !isset($row['class']) &&
                                    isset($row['function'])
                                ): ?>
                                    &nbsp;&nbsp;&mdash;&nbsp;&nbsp; <?= $row[
                                        'function'
                                    ] ?>()
                                <?php endif; ?>
                            </p>

                            <!-- Source? -->
                            <?php if (
                                isset($row['file']) &&
                                is_file($row['file']) &&
                                isset($row['class'])
                            ): ?>
                                <div class="source">
                                    <?= static::highlightFile(
                                        $row['file'],
                                        $row['line']
                                    ) ?>
                                </div>
                            <?php endif; ?>
                        </li>

                    <?php endforeach; ?>
                </ol>

            </div>

            <!-- Server -->
            <div class="content" id="server">
                <?php foreach (['_SERVER', '_SESSION'] as $var): ?>
                    <?php if (
                        empty($GLOBALS[$var]) ||
                        !is_array($GLOBALS[$var])
                    ) {
                        continue;
                    } ?>

                    <h3>$<?= $var ?></h3>

                    <table>
                        <thead>
                            <tr>
                                <th>Key</th>
                                <th>Value</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($GLOBALS[$var] as $key => $value): ?>
                                <tr>
                                    <td><?= htmlspecialchars(
                                        $key,
                                        ENT_IGNORE,
                                        'UTF-8'
                                    ) ?></td>
                                    <td>
                                        <?php if (is_string($value)): ?>
                                            <?= htmlspecialchars(
                                                $value,
                                                ENT_SUBSTITUTE,
                                                'UTF-8'
                                            ) ?>
                                        <?php else: ?>
                                            <?= '<pre>' .
                                                print_r($value, true) ?>
                                        <?php endif; ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                <?php endforeach; ?>

                <!-- Constants -->
                <?php $constants = get_defined_constants(true); ?>
                <?php if (!empty($constants['user'])): ?>
                    <h3>Constants</h3>

                    <table>
                        <thead>
                            <tr>
                                <th>Key</th>
                                <th>Value</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach (
                                $constants['user']
                                as $key => $value
                            ): ?>
                                <tr>
                                    <td><?= htmlspecialchars(
                                        $key,
                                        ENT_IGNORE,
                                        'UTF-8'
                                    ) ?></td>
                                    <td>
                                        <?php if (
                                            !is_array($value) &&
                                            !is_object($value)
                                        ): ?>
                                            <?= htmlspecialchars(
                                                $value,
                                                ENT_SUBSTITUTE,
                                                'UTF-8'
                                            ) ?>
                                        <?php else: ?>
                                            <?= '<pre>' .
                                                print_r($value, true) ?>
                                        <?php endif; ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                <?php endif; ?>
            </div>

            <!-- Request -->
            <div class="content" id="request">
                <?php $request = \Config\Services::request(); ?>

                <table>
                    <tbody>
                        <tr>
                            <td style="width: 10em">Path</td>
                            <td><?= $request->uri ?></td>
                        </tr>
                        <tr>
                            <td>HTTP Method</td>
                            <td><?= $request->getMethod(true) ?></td>
                        </tr>
                        <tr>
                            <td>IP Address</td>
                            <td><?= $request->getIPAddress() ?></td>
                        </tr>
                        <tr>
                            <td style="width: 10em">Is AJAX Request?</td>
                            <td><?= $request->isAJAX() ? 'yes' : 'no' ?></td>
                        </tr>
                        <tr>
                            <td>Is CLI Request?</td>
                            <td><?= $request->isCLI() ? 'yes' : 'no' ?></td>
                        </tr>
                        <tr>
                            <td>Is Secure Request?</td>
                            <td><?= $request->isSecure() ? 'yes' : 'no' ?></td>
                        </tr>
                        <tr>
                            <td>User Agent</td>
                            <td><?= $request
                                ->getUserAgent()
                                ->getAgentString() ?></td>
                        </tr>

                    </tbody>
                </table>


                <?php $empty = true; ?>
                <?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?>
                    <?php if (
                        empty($GLOBALS[$var]) ||
                        !is_array($GLOBALS[$var])
                    ) {
                        continue;
                    } ?>

                    <?php $empty = false; ?>

                    <h3>$<?= $var ?></h3>

                    <table style="width: 100%">
                        <thead>
                            <tr>
                                <th>Key</th>
                                <th>Value</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($GLOBALS[$var] as $key => $value): ?>
                                <tr>
                                    <td><?= htmlspecialchars(
                                        $key,
                                        ENT_IGNORE,
                                        'UTF-8'
                                    ) ?></td>
                                    <td>
                                        <?php if (
                                            !is_array($value) &&
                                            !is_object($value)
                                        ): ?>
                                            <?= htmlspecialchars(
                                                $value,
                                                ENT_SUBSTITUTE,
                                                'UTF-8'
                                            ) ?>
                                        <?php else: ?>
                                            <?= '<pre>' .
                                                print_r($value, true) ?>
                                        <?php endif; ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                <?php endforeach; ?>

                <?php if ($empty): ?>
                    <div class="alert">
                        No $_GET, $_POST, or $_COOKIE Information to show.
                    </div>

                <?php endif; ?>

                <?php $headers = $request->getHeaders(); ?>
                <?php if (!empty($headers)): ?>
                    <h3>Headers</h3>

                    <table>
                        <thead>
                            <tr>
                                <th>Header</th>
                                <th>Value</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($headers as $value): ?>
                                <?php if (empty($value)) {
                                    continue;
                                } ?>
                                <?php if (!is_array($value)) {
                                    $value = [$value];
                                } ?>
                                <?php foreach ($value as $h): ?>
                                    <tr>
                                        <td><?= esc(
                                            $h->getName(),
                                            'html'
                                        ) ?></td>
                                        <td><?= esc(
                                            $h->getValueLine(),
                                            'html'
                                        ) ?></td>
                                    </tr>
                                <?php endforeach; ?>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                <?php endif; ?>
            </div>

            <!-- Response -->
            <?php
            $response = \Config\Services::response();
            $response->setStatusCode(http_response_code());
            ?>
            <div class="content" id="response">
                <table>
                    <tr>
                        <td style="width: 15em">Response Status</td>
                        <td><?= $response->getStatusCode() .
                            ' - ' .
                            $response->getReason() ?></td>
                    </tr>
                </table>

                <?php $headers = $response->getHeaders(); ?>
                <?php if (!empty($headers)): ?>
                    <?php natsort($headers); ?>

                    <h3>Headers</h3>

                    <table>
                        <thead>
                            <tr>
                                <th>Header</th>
                                <th>Value</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($headers as $name => $value): ?>
                                <tr>
                                    <td><?= esc($name, 'html') ?></td>
                                    <td><?= esc(
                                        $response->getHeaderLine($name),
                                        'html'
                                    ) ?></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                <?php endif; ?>
            </div>

            <!-- Files -->
            <div class="content" id="files">
                <?php $files = get_included_files(); ?>

                <ol>
                    <?php foreach ($files as $file): ?>
                        <li><?= htmlspecialchars(
                            static::cleanPath($file),
                            ENT_SUBSTITUTE,
                            'UTF-8'
                        ) ?></li>
                    <?php endforeach; ?>
                </ol>
            </div>

            <!-- Memory -->
            <div class="content" id="memory">

                <table>
                    <tbody>
                        <tr>
                            <td>Memory Usage</td>
                            <td><?= static::describeMemory(
                                memory_get_usage(true)
                            ) ?></td>
                        </tr>
                        <tr>
                            <td style="width: 12em">Peak Memory Usage:</td>
                            <td><?= static::describeMemory(
                                memory_get_peak_usage(true)
                            ) ?></td>
                        </tr>
                        <tr>
                            <td>Memory Limit:</td>
                            <td><?= ini_get('memory_limit') ?></td>
                        </tr>
                    </tbody>
                </table>

            </div>

        </div> <!-- /tab-content -->

    </div> <!-- /container -->

    <div class="footer">
        <div class="container">

            <p>
                Displayed at <?= date('H:i:sa') ?> &mdash;
                PHP: <?= phpversion() ?> &mdash;
                CodeIgniter: <?= \CodeIgniter\CodeIgniter::CI_VERSION ?>
            </p>

        </div>
    </div>

</body>

</html>