<?php

declare(strict_types=1);

namespace Doctrine\RST\Templates;

use Doctrine\RST\Configuration;
use Twig\Environment as TwigEnvironment;
use Twig\Loader\FilesystemLoader;

use function file_exists;
use function sprintf;

final class TwigEnvironmentFactory
{
    public static function createTwigEnvironment(Configuration $configuration): TwigEnvironment
    {
        $loader = new FilesystemLoader(self::getTemplateDirs($configuration));

        return new TwigEnvironment($loader, [
            'strict_variables' => true,
            'cache' => sprintf('%s/twig', $configuration->getCacheDir()),
            'auto_reload' => true,
        ]);
    }

    /** @return string[] */
    private static function getTemplateDirs(Configuration $configuration): array
    {
        $themeDirs     = [];
        $fileExtension = $configuration->getFileExtension();

        $templateDirectories = $configuration->getCustomTemplateDirs();
        // add the fallback directory
        $templateDirectories[] = __DIR__;

        foreach ($templateDirectories as $templateDir) {
            $themePath = $templateDir . '/' . $configuration->getTheme() . '/' . $fileExtension;
            if (! file_exists($themePath)) {
                continue;
            }

            $themeDirs[] = $themePath;
        }

        // look for the fallback "default" in all directories
        if ($configuration->getTheme() !== Configuration::THEME_DEFAULT) {
            foreach ($templateDirectories as $templateDir) {
                $themePath = $templateDir . '/' . Configuration::THEME_DEFAULT . '/' . $fileExtension;
                if (! file_exists($themePath)) {
                    continue;
                }

                $themeDirs[] = $themePath;
            }
        }

        return $themeDirs;
    }
}