<?php

namespace FSVendor\WPDesk\View;

use FSVendor\WPDesk\View\Renderer\SimplePhpRenderer;
use FSVendor\WPDesk\View\Resolver\ChainResolver;
use FSVendor\WPDesk\View\Resolver\DirResolver;
use FSVendor\WPDesk\View\Resolver\WPThemeResolver;
/**
 * Facilitates building of the default plugin renderer.
 *
 * @package WPDesk\View
 */
class PluginViewBuilder
{
    /** @var string */
    private $plugin_dir;
    /** @var string[] */
    private $template_dirs;
    /**
     * @param string $plugin_dir Plugin directory path(absolute path)
     * @param string|string[] $template_dir Directory or list of directories with templates to render
     */
    public function __construct($plugin_dir, $template_dir = 'templates')
    {
        $this->plugin_dir = $plugin_dir;
        if (!is_array($template_dir)) {
            $this->template_dirs = [$template_dir];
        } else {
            $this->template_dirs = $template_dir;
        }
    }
    /**
     * Creates simple renderer that search for the templates in plugin dir and in theme/child dir.
     *
     * For example if your plugin dir is /plugin, template dir is /templates, theme is /theme, and a child theme is /child
     * the templates will be loaded from(order is important):
     * - /child/plugin/*.php
     * - /theme/plugin/*.php
     * - /plugin/templates/*.php
     *
     * @return SimplePhpRenderer
     */
    public function createSimpleRenderer()
    {
        $resolver = new ChainResolver();
        $resolver->appendResolver(new WPThemeResolver(basename($this->plugin_dir)));
        foreach ($this->template_dirs as $dir) {
            $dir = trailingslashit($this->plugin_dir) . trailingslashit($dir);
            $resolver->appendResolver(new DirResolver($dir));
        }
        return new SimplePhpRenderer($resolver);
    }
    /**
     * Load templates using simple renderer.
     *
     * @param string $name Name of the template
     * @param string $path Additional path of the template ie. for path "path" the templates would be loaded from /plugin/templates/path/*.php
     * @param array $args Arguments for templates to use
     *
     * @return string Rendered template.
     */
    public function loadTemplate($name, $path = '.', $args = [])
    {
        $renderer = $this->createSimpleRenderer();
        return $renderer->render(trailingslashit($path) . $name, $args);
    }
}
