<?php

namespace App\Tests\Shared;

use App\Shared\DependencyInjection\CorsRegexEnvProcessor;
use PHPUnit\Framework\TestCase;

class CorsRegexEnvProcessorTest extends TestCase
{
    private function regexFor(string $hosts): string
    {
        $processor = new CorsRegexEnvProcessor();
        return $processor->getEnv('cors_regex', 'ALLOWED_FRONTEND_HOSTS', fn () => $hosts);
    }

    /** رجکس ساخته‌شده با delimiter نلمیو (`#`) کامپایل و روی origin تست می‌شود. */
    private function originMatches(string $regex, string $origin): bool
    {
        return (bool) preg_match('#' . $regex . '#i', $origin);
    }

    public function testAllowsListedHostsHttpsAndSubdomains(): void
    {
        $regex = $this->regexFor('yasuj-nobat.ir,nobat724.com');

        $this->assertTrue($this->originMatches($regex, 'https://yasuj-nobat.ir'));
        $this->assertTrue($this->originMatches($regex, 'https://www.nobat724.com'));
    }

    public function testAllowsHttpAndPortForLocalDev(): void
    {
        $regex = $this->regexFor('localhost,yazd-nobat.localhost');

        $this->assertTrue($this->originMatches($regex, 'http://yazd-nobat.localhost:3000'));
        $this->assertTrue($this->originMatches($regex, 'http://localhost:8080'));
    }

    public function testRejectsUnlistedAndLookalikeHosts(): void
    {
        $regex = $this->regexFor('yasuj-nobat.ir');

        $this->assertFalse($this->originMatches($regex, 'https://evil.com'));
        // انکورِ انتها: دامنه‌ای که با هاست مجاز شروع/تمام نشود نباید مچ شود.
        $this->assertFalse($this->originMatches($regex, 'https://yasuj-nobat.ir.evil.com'));
        $this->assertFalse($this->originMatches($regex, 'https://notyasuj-nobat.ir'));
    }

    public function testDotIsEscapedNotWildcard(): void
    {
        $regex = $this->regexFor('nobat724.com');

        // نقطه نباید به‌عنوان wildcard عمل کند.
        $this->assertFalse($this->originMatches($regex, 'https://nobat724xcom'));
    }

    public function testEmptyListMatchesNothing(): void
    {
        $regex = $this->regexFor('');

        $this->assertFalse($this->originMatches($regex, 'https://yasuj-nobat.ir'));
        $this->assertFalse($this->originMatches($regex, 'https://anything.com'));
    }

    public function testProvidedType(): void
    {
        $this->assertSame(['cors_regex' => 'string'], CorsRegexEnvProcessor::getProvidedTypes());
    }
}
