<?php

use mindplay\walkway\Route;
use Phly\Conduit\MiddlewareInterface;
use Phly\Conduit\MiddlewarePipe;
use Phly\Http\Server;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;

require __DIR__ . '/vendor/autoload.php';

// Simple middle-ware layer for Walkway Modules:

class WalkwayMiddleware implements MiddlewareInterface
{
    /**
     * @var mindplay\walkway\Module
     */
    private $router;

    public function __construct(mindplay\walkway\Module $router)
    {
        $this->router = $router;
    }

    /**
     * {@inheritdoc}
     */
    public function __invoke(Request $request, Response $response, callable $next = null)
    {
        $path = $request->getUri()->getPath();
        $method = $request->getMethod();

        $this->router->vars['request'] = $request;
        $this->router->vars['response'] = $response;

        $route = $this->router->resolve($path);

        if ($route === null) {
            return $next($request, $response);
        }

        $result = $route->execute($method);

        if ($result instanceof Response) {
            $response = $result;
        } else {
            $response->getBody()->write($result);
        }

        return $response;
    }
}

// Sample Walkway Module:

$router = new mindplay\walkway\Module();

$router['hello'] = function (Route $route) {
    $route['world'] = function (Route $route) {
        $route->get = function(Request $request) {
            return '<h1>Hello, World!</h1><pre>' . htmlspecialchars(print_r($request, true)) . '</pre>';
        };
    };
};

// Configure and run Conduit:

$app = new MiddlewarePipe();

$app->pipe(new WalkwayMiddleware($router));

$server = Server::createServer($app, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);

$server->listen();