<?php

namespace Src\Common\Pages\Sidebar;

use Src\Common\Interfaces\Pages\Sidebar\IItem;
use Src\Common\Interfaces\Pages\Sidebar\IFactory as ISidebarFactory;
use Src\Common\Interfaces\Pages\Sidebar\ISubItem;

/**
 * Класс элемента меню сайдбара
 * Реализует функциональность пункта меню и его подпунктов
 */
class Item implements IItem
{
    /**
     * Коллекция подпунктов меню
     * @var ISubItem[] Массив объектов подпунктов
     */
    protected array $subitems = [];

    /**
     * Заголовок пункта меню
     * @var mixed
     */
    protected $title;

    /**
     * URL пункта меню
     * @var mixed
     */
    protected $url;

    /**
     * Фабрика для создания элементов сайдбара
     * @var ISidebarFactory
     */
    protected $sidebarFactory;

    /**
     * Устанавливает фабрику элементов сайдбара
     * @param ISidebarFactory $factory
     */
    public function setSidebarFactory(ISidebarFactory $factory)
    {
        $this->sidebarFactory = $factory;
    }

    /**
     * Возвращает подпункты текущего пункта меню
     * @return ISubItem[] Массив подпунктов
     */
    public function getSubItems()
    {
        return $this->subitems;
    }

    /**
     * Возвращает заголовок пункта меню
     * @return mixed
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Возвращает URL пункта меню
     * @return mixed
     */
    public function getUrl()
    {
        return $this->url;
    }

    /**
     * Загружает данные пункта меню
     * @param array $itemData {
     *     @type string $title Заголовок пункта
     *     @type string $url Ссылка пункта
     *     @type array $subItems Массив данных подпунктов
     * }
     */
    public function load(array $itemData)
    {
        $this->title = $itemData['title'] ?? null;
        $this->url = $itemData['url'] ?? null;

        // Создание и загрузка подпунктов
        foreach ($itemData['subItems'] ?? [] as $subItemData) {
            $subItem = $this->sidebarFactory->createSubItem();
            $subItem->load($subItemData);
            $this->subitems[] = $subItem;
        }
    }
}
