<?php

namespace Picea\Method;

use Picea\Extension\Extension,
    Picea\Extension\ExtensionTrait;

use Picea\Compiler\Context;

use Psr\Http\Message\ServerRequestInterface;

class Request implements Extension {
    use ExtensionTrait;

    public array $tokens;

    public string $token;
    
    public ServerRequestInterface $request;

    public function __construct(ServerRequestInterface $request, Context $context) {
        $this->request = $request;
        $this->register($context);
    }

    public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) : string { }

    public function register(Context $context) : void
    {
        $context->pushFunction("cookie", [ $this, 'cookie' ]);
        $context->pushFunction("get",  [ $this, 'get'  ]);
        $context->pushFunction("post", [ $this, 'post' ]);
        $context->pushFunction("request", [ $this, 'request' ]);
        $context->pushFunction("server", [ $this, 'server' ]);
    }
    
    public function cookie(? string $variableName = null, $default = null)
    {
        return $variableName === null ? $this->request->getCookieParams() : static::arrayGet($this->request->getCookieParams(), $variableName) ?? $default;
    }
    
    public function get(? string $variableName = null, $default = null)
    {
        return $variableName === null ? $this->request->getQueryParams() : static::arrayGet($this->request->getQueryParams(), $variableName) ?? $default;
    }
    
    public function post(? string $variableName = null, $default = null)
    {
        return $variableName === null ? $this->request->getParsedBody() : static::arrayGet($this->request->getParsedBody(), $variableName) ?? $default;
    }
    
    public function request(? string $variableName = null, $default = null)
    {
        return $variableName === null ? array_merge($this->get(), $this->post()) : $this->post($variableName) ?? $this->get($variableName) ?? $default;
    }
    
    public function server(? string $variableName = null, $default = null)
    {
        return $variableName === null ? $this->request->getServerParams() : static::arrayGet($this->request->getServerParams(), $variableName) ?? $default;
    }
    
    public static function arrayGet(array $array, string $path, string $delimiter = '.') 
    {
        $pathArr = explode($delimiter, $path);

        if ( isset($array[$pathArr[0]]) ) {
            if ( isset($pathArr[1]) ) {
                return static::arrayGet($array[array_shift($pathArr)], implode($delimiter, $pathArr));
            }
            else {
                return $array[$pathArr[0]];
            }
        }
        else {
            return null;
        }
    }
}