<?php

namespace IQDEV\ElasticSearch\Criteria;

use IQDEV\ElasticSearch\Criteria\Aggs\AggsCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection;
use IQDEV\ElasticSearch\Criteria\Order\OrderCollection;
use IQDEV\ElasticSearch\Criteria\Search\SearchCollection;

final class Criteria
{
    private SearchCollection $search;
    private FilterCollection $filters;
    private OrderCollection $sorting;
    private Pagination $pagination;

    private AggsCollection $aggregations;

    public function __construct()
    {
        $this->search = new SearchCollection();
        $this->filters = new FilterCollection();
        $this->sorting = new OrderCollection();
        $this->pagination = new Pagination();
        $this->aggregations = new AggsCollection();
    }

    public function getSearch(): SearchCollection
    {
        return $this->search;
    }

    public function getFilters(): FilterCollection
    {
        return $this->filters;
    }

    public function getSorting(): OrderCollection
    {
        return $this->sorting;
    }

    public function getPagination(): Pagination
    {
        return $this->pagination;
    }

    public function getAggs(): AggsCollection
    {
        return $this->aggregations;
    }

    public function __clone(): void
    {
        $this->search = clone $this->search;
        $this->filters = clone $this->filters;
        $this->sorting = clone $this->sorting;
        $this->pagination = clone $this->pagination;
        $this->aggregations = clone $this->aggregations;
    }
}