<?php

namespace tests\Unit\Domain\Parameter;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Infinito\Domain\Parameter\Parameter\VersionParameter;
use Infinito\Domain\Parameter\ParameterFactory;
use Infinito\Domain\Parameter\ValidGetParametersService;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Infinito\Domain\Parameter\ValidGetParameterServiceInterface;
use Infinito\Domain\Parameter\Parameter\ViewParameter;
use Infinito\DBAL\Types\ActionType;
use Infinito\Exception\Collection\NotSetElementException;
use Infinito\Exception\Core\NotImplementedCoreException;

/**
 * This class is a bit messed up because it is an recycled class of an other unit.
 *
 * @author kevinfrantz
 */
class ValidGetParameterServiceTest extends KernelTestCase
{
    /**
     * @var Request
     */
    private $currentRequest;

    /**
     * @var RequestStack
     */
    private $requestStack;

    /**
     * @var ValidGetParameterServiceInterface
     */
    private $validGetParameterService;

    public function setUp(): void
    {
        $this->currentRequest = new Request();
        $this->requestStack = $this->createMock(RequestStack::class);
        $this->requestStack->method('getCurrentRequest')->willReturn($this->currentRequest);
        $parameterFactory = new ParameterFactory();
        self::bootKernel();
        $validator = self::$container->get(ValidatorInterface::class);
        $this->validGetParameterService = new ValidGetParametersService($this->requestStack, $parameterFactory, $validator);
    }

    /**
     * @todo Move this tests to the functional test section
     */
    public function testHasAndGetParameter(): void
    {
        $parameterFactory = new ParameterFactory();
        foreach ($parameterFactory->getAllParameters()->getKeys() as $key) {
            $this->assertFalse($this->validGetParameterService->hasParameter($key));
            switch ($key) {
                case VersionParameter::getKey():
                    $value = 1;
                    break;
                case ViewParameter::getKey():
                    $value = ActionType::EXECUTE;
                    break;
                default:
                    $value = true;
            }
            $this->currentRequest->query->set($key, $value);
            $this->assertTrue($this->validGetParameterService->hasParameter($key));
            $this->assertEquals($value, $this->validGetParameterService->getParameter($key));
        }
    }

    public function testNotImplementedException(): void
    {
        $this->expectException(NotImplementedCoreException::class);
        $this->validGetParameterService->getParameter('12312312asdas');
    }

    public function testNotSetParameterException(): void
    {
        $this->expectException(NotSetElementException::class);
        $this->validGetParameterService->getParameter(VersionParameter::getKey());
    }
}