<?php

declare(strict_types=1);

namespace Doctrine\Tests\RST\BuilderUrl;

use Doctrine\RST\Builder;
use Doctrine\RST\Configuration;
use Doctrine\RST\Kernel;
use Doctrine\Tests\RST\BaseBuilderTest;

use function strpos;

class BuilderUrlTest extends BaseBuilderTest
{
    /** @var Configuration */
    private $configuration;

    public function testBaseUrl(): void
    {
        $this->configuration->setBaseUrl('https://www.domain.com/directory');

        $this->builder->build($this->sourceFile(), $this->targetFile());

        $contents = $this->getFileContents($this->targetFile('index.html'));

        self::assertStringContainsString(
            '<a href="https://www.domain.com/directory/index.html">Test reference url</a>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="index-html-base-url" class="toc-item"><a href="https://www.domain.com/directory/index.html#base-url">Base URL</a></li>',
            $contents
        );

        $contents = $this->getFileContents($this->targetFile('subdir/index.html'));

        self::assertStringContainsString(
            '<a href="https://www.domain.com/directory/index.html">Test subdir reference url</a>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="index-html" class="toc-item"><a href="https://www.domain.com/directory/index.html">Base URL</a></li>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="file-html" class="toc-item"><a href="https://www.domain.com/directory/subdir/file.html">Subdirectory File</a></li>',
            $contents
        );
    }

    public function testBaseUrlEnabledCallable(): void
    {
        $this->configuration->setBaseUrl('https://www.domain.com/directory');
        $this->configuration->setBaseUrlEnabledCallable(static function (string $path): bool {
            return strpos($path, 'subdir/') !== 0;
        });

        $this->builder->build($this->sourceFile(), $this->targetFile());

        $contents = $this->getFileContents($this->targetFile('index.html'));

        self::assertStringContainsString(
            '<a href="https://www.domain.com/directory/index.html">Test reference url</a>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="index-html-base-url" class="toc-item"><a href="https://www.domain.com/directory/index.html#base-url">Base URL</a></li>',
            $contents
        );

        $contents = $this->getFileContents($this->targetFile('subdir/index.html'));

        self::assertStringContainsString(
            '<a href="https://www.domain.com/directory/index.html">Test subdir reference url</a>',
            $contents
        );

        self::assertStringContainsString(
            '<a href="file.html">Test subdir file reference path</a>',
            $contents
        );

        self::assertStringContainsString(
            '<a href="index.html#subdirectory-index">Subdirectory Index</a>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="index-html" class="toc-item"><a href="https://www.domain.com/directory/index.html">Base URL</a></li>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="file-html" class="toc-item"><a href="file.html">Subdirectory File</a></li>',
            $contents
        );
    }

    public function testRelativeUrl(): void
    {
        $this->builder->build($this->sourceFile(), $this->targetFile());

        $contents = $this->getFileContents($this->targetFile('index.html'));

        self::assertStringContainsString(
            '<a href="index.html">Test reference url</a>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="index-html-base-url" class="toc-item"><a href="index.html#base-url">Base URL</a></li>',
            $contents
        );

        $contents = $this->getFileContents($this->targetFile('subdir/index.html'));

        self::assertStringContainsString(
            '<a href="../index.html">Test subdir reference url</a>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="index-html" class="toc-item"><a href="../index.html">Base URL</a></li>',
            $contents
        );

        self::assertStringContainsString(
            '<li id="file-html" class="toc-item"><a href="file.html">Subdirectory File</a></li>',
            $contents
        );
    }

    protected function setUp(): void
    {
        $this->configuration = new Configuration();
        $this->configuration->setUseCachedMetas(false);
        $this->builder = new Builder(new Kernel($this->configuration));
    }

    protected function getFixturesDirectory(): string
    {
        return 'BuilderUrl';
    }
}