<?php

declare(strict_types=1);

namespace WerkraumMedia\Events\Tests\Unit\Service\DestinationDataImportService;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\MockObject\Stub;
use PHPUnit\Framework\TestCase;
use WerkraumMedia\Events\Domain\Model\Import;
use WerkraumMedia\Events\Service\DestinationDataImportService\UrlFactory;

class UrlFactoryTest extends TestCase
{
    #[Test]
    public function canBeCreated(): void
    {
        $subject = new UrlFactory();

        self::assertInstanceOf(
            UrlFactory::class,
            $subject
        );
    }

    #[DataProvider('possibleImports')]
    #[Test]
    /**
     * @param Stub&Import $import
     */
    public function createSearchResultUrl(
        Import $import,
        string $expectedResult
    ): void {
        $subject = new UrlFactory();

        $result = $subject->createSearchResultUrl($import);

        self::assertSame(
            $result,
            $expectedResult
        );
    }

    public static function possibleImports(): array
    {
        return [
            'All provided' => [
                'import' => (function () {
                    $import = self::createStub(Import::class);
                    $import->method('getRestLicenseKey')->willReturn('licenseKey');
                    $import->method('getRestExperience')->willReturn('experience');
                    $import->method('getRestMode')->willReturn('restMode');
                    $import->method('getRestLimit')->willReturn(500);
                    $import->method('getRestSearchQuery')->willReturn('');

                    return $import;
                })(),
                'expectedResult' => 'http://meta.et4.de/rest.ashx/search/?experience=experience&licensekey=licenseKey&type=Event&mode=restMode&limit=500&template=ET2014A.json',
            ],
            'All missing' => [
                'import' => (function () {
                    return self::createStub(Import::class);
                })(),
                'expectedResult' => 'http://meta.et4.de/rest.ashx/search/?type=Event&template=ET2014A.json',
            ],
            'Some missing' => [
                'import' => (function () {
                    $import = self::createStub(Import::class);
                    $import->method('getRestLicenseKey')->willReturn('licenseKey');
                    $import->method('getRestExperience')->willReturn('experience');
                    $import->method('getRestLimit')->willReturn(500);

                    return $import;
                })(),
                'expectedResult' => 'http://meta.et4.de/rest.ashx/search/?experience=experience&licensekey=licenseKey&type=Event&limit=500&template=ET2014A.json',
            ],
            'With search query' => [
                'import' => (function () {
                    $import = self::createStub(Import::class);
                    $import->method('getRestExperience')->willReturn('experience');
                    $import->method('getRestSearchQuery')->willReturn('name:"Test Something"');

                    return $import;
                })(),
                'expectedResult' => 'http://meta.et4.de/rest.ashx/search/?experience=experience&type=Event&template=ET2014A.json&q=name%3A%22Test+Something%22',
            ],
        ];
    }
}