<?php

namespace Src\Common\Pages;

use Src\Common\Interfaces\Pages\IFactory;
use Src\Common\Interfaces\Pages\Sidebar\IFactory as ISidebarFactory;
use Src\Common\Pages\Sidebar\Factory as SidebarFactory;

/**
 * Фабрика для создания компонентов страниц
 * Реализует паттерн "Абстрактная фабрика" для управления зависимостями страниц
 */
class Factory implements IFactory
{
    /**
     * Фабрика для создания сайдбара
     * @var ISidebarFactory|null Экземпляр фабрики сайдбара (ленивая инициализация)
     */
    protected ?ISidebarFactory $sidebarFactory = null;

    /**
     * Конфигурация фабрики
     * @var array Хранит настройки для создания компонентов
     */
    protected array $conf;

    /**
     * Инициализация фабрики с конфигурацией
     * @param array $conf Конфигурационные данные:
     *        - ['class']: класс фабрики сайдбара
     *        - ['conf']: конфигурация для фабрики сайдбара
     */
    public function init(array $conf = []): void
    {
        // Базовая конфигурация по умолчанию
        $this->conf[ISidebarFactory::class] = [
            'class' => SidebarFactory::class,  // Класс фабрики сайдбара по умолчанию
            'conf' => [],                      // Конфигурация для фабрики сайдбара
        ];

        // Объединение с переданной конфигурацией
        $this->conf = array_replace_recursive($this->conf, $conf);
    }

    /**
     * Получение фабрики сайдбара (с ленивой инициализацией)
     * @return SidebarFactory Экземпляр фабрики сайдбара
     */
    public function getSidebarFactory(): SidebarFactory
    {
        if ($this->sidebarFactory === null) {
            // Создание экземпляра фабрики сайдбара
            $this->sidebarFactory = new $this->conf[ISidebarFactory::class]['class']();

            // Инициализация фабрики с конфигурацией
            $this->sidebarFactory->init($this->conf[ISidebarFactory::class]['conf']);
        }

        return $this->sidebarFactory;
    }
}
