<?php

namespace goodboyalex\php_components_pack\classes;

use ArrayAccess;
use Countable;
use goodboyalex\php_components_pack\interfaces\ISerializable;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayBasicTrait;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayConstantsTrait;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayLINQTrait;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySearchAndSortTrait;
use IteratorAggregate;

/**
 * Класс, описывающий массив объектов.
 *
 * @author Александр Бабаев
 * @package php_components_pack
 * @version 1.0
 * @since 1.0
 */
final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, ISerializable
{
    /**
     * @var array $Container Массив объектов, хранящихся в данном классе.
     */
    private array $Container;

    // Реализация наследуемых интерфейсов и классов
    use ObjectArrayBasicTrait;

    // Константы
    use ObjectArrayConstantsTrait;

    // Поиск элемента
    use ObjectArraySearchAndSortTrait;

    // LINQ-подобные методы
    use ObjectArrayLINQTrait;

    /**
     * Конструктор класса.
     *
     * @param array $array Массив объектов, который будет храниться в данном классе.
     */
    public function __construct (array $array = [])
    {
        $this->Container = $array;
    }

    /**
     * Возвращает массив объектов, хранящихся в данном классе.
     *
     * @return array Массив объектов, хранящихся в данном классе.
     */
    public function ToArray (): array
    {
        return $this->Container;
    }

    /**
     * Очищает массив объектов, хранящийся в данном классе.
     *
     * @return void
     */
    public function Clear (): void
    {
        // Очищаем массив
        unset($this->Container);

        // Создаем новый массив
        $this->Container = [];
    }

    /**
     * Объединяет массив объектов, хранящийся в данном классе, с массивом объектов, переданным в качестве параметра.
     *
     * @param array $objects Массив объектов, который будет объединен с массивом объектов, хранящимся в данном классе.
     *
     * @return void
     */
    public function Merge (array $objects): void
    {
        $this->Container = array_merge($this->Container, $objects);
    }
}