<?php

declare(strict_types=1);

/*
 * This is the test file where we can open up a quick test server and make
 * sure that the UI is really working the way we would expect it to.
 *
 * @author Kristaps Muižnieks https://github.com/krmu
 */

require_once file_exists(__DIR__ . '/../../vendor/autoload.php')
    ? __DIR__ . '/../../vendor/autoload.php'
    : __DIR__ . '/../../flight/autoload.php';

Flight::set('flight.content_length', false);
Flight::set('flight.views.path', './');
Flight::set('flight.views.extension', '.phtml');
//Flight::set('flight.v2.output_buffering', true);

require_once 'LayoutMiddleware.php';

Flight::group('', function () {

    // Test 1: Root route
    Flight::route('/', function () {
        echo '<span id="infotext">Route text:</span> Root route works!';
    });
    Flight::route('/querytestpath', function () {
        echo '<span id="infotext">Route text:</span> This ir query route<br>';
        echo "I got such query parameters:<pre>";
        print_r(Flight::request()->query);
        echo "</pre>";
    }, false, "querytestpath");

    // Test 2: Simple route
    Flight::route('/test', function () {
        echo '<span id="infotext">Route text:</span> Test route works!';
    });

    // Test 3: Route with parameter
    Flight::route('/user/@name', function ($name) {
        echo "<span id='infotext'>Route text:</span> Hello, $name!";
    });
    Flight::route('POST /postpage', function () {
        echo '<span id="infotext">Route text:</span> THIS IS POST METHOD PAGE';
    }, false, "postpage");

    // Test 4: Grouped routes
    Flight::group('/group', function () {
        Flight::route('/test', function () {
            echo '<span id="infotext">Route text:</span> Group test route works!';
        });
        Flight::route('/user/@name', function ($name) {
            echo "<span id='infotext'>Route text:</span> There is variable called name and it is $name";
        });
        Flight::group('/group1', function () {
            Flight::group('/group2', function () {
                Flight::group('/group3', function () {
                    Flight::group('/group4', function () {
                        Flight::group('/group5', function () {
                            Flight::group('/group6', function () {
                                Flight::group('/group7', function () {
                                    Flight::group('/group8', function () {
                                        Flight::route('/final_group', function () {
                                            echo 'Mega Group test route works!';
                                        }, false, "final_group");
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    });

    // Test 5: Route alias
    Flight::route('/alias', function () {
        echo '<span id="infotext">Route text:</span> Alias route works!';
    }, false, 'aliasroute');

    /** Middleware test */
    include_once 'AuthCheck.php';
    $middle = new AuthCheck();
    // Test 6: Route with middleware
    Flight::route('/protected', function () {
        echo '<span id="infotext">Route text:</span> Protected route works!';
    })->addMiddleware([$middle]);

    // Test 7: Route with template
    Flight::route('/template/@name', function ($name) {
        Flight::render('template.phtml', ['name' => $name]);
    });

    // Test 8: Throw an error
    Flight::route('/error', function () {
        trigger_error('This is a successful error');
    });
}, [new LayoutMiddleware()]);

Flight::map('error', function (Throwable $e) {
    $styles = join(';', [
        'border: 2px solid red',
        'padding: 21px',
        'background: lightgray',
        'font-weight: bold'
    ]);

    echo sprintf(
        "<h1>500 Internal Server Error</h1><h3>%s (%s)</h3><pre style=\"$styles\">%s</pre>",
        $e->getMessage(),
        $e->getCode(),
        str_replace(getenv('PWD'), '***CONFIDENTIAL***', $e->getTraceAsString())
    );

    echo "<br><a href='/'>Go back</a>";
});
Flight::map('notFound', function () {
    echo '<span id="infotext">Route text:</span> The requested URL was not found<br>';
    echo "<a href='/'>Go back</a>";
});

Flight::start();