<?php

declare (strict_types=1);
namespace CelerSearch\Vendor\Meilisearch\Contracts;

/** @internal */
class FacetSearchQuery
{
    /**
     * @var non-empty-string|null
     */
    private ?string $facetName = null;
    /**
     * @var non-empty-string|null
     */
    private ?string $facetQuery = null;
    private ?string $q = null;
    /**
     * @var list<non-empty-string|list<non-empty-string>>|null
     */
    private ?array $filter = null;
    /**
     * @var 'last'|'all'|'frequency'|null
     */
    private ?string $matchingStrategy = null;
    /**
     * @var non-empty-list<non-empty-string>|null
     */
    private ?array $attributesToSearchOn = null;
    private ?bool $exhaustiveFacetsCount = null;
    /**
     * @return $this
     */
    public function setFacetName(string $facetName) : self
    {
        $this->facetName = $facetName;
        return $this;
    }
    /**
     * @return $this
     */
    public function setFacetQuery(string $facetQuery) : self
    {
        $this->facetQuery = $facetQuery;
        return $this;
    }
    /**
     * @return $this
     */
    public function setQuery(string $q) : self
    {
        $this->q = $q;
        return $this;
    }
    /**
     * @param list<non-empty-string|list<non-empty-string>> $filter
     *
     * @return $this
     */
    public function setFilter(array $filter) : self
    {
        $this->filter = $filter;
        return $this;
    }
    /**
     * @param 'last'|'all'|'frequency' $matchingStrategy
     *
     * @return $this
     */
    public function setMatchingStrategy(string $matchingStrategy) : self
    {
        $this->matchingStrategy = $matchingStrategy;
        return $this;
    }
    /**
     * @param non-empty-list<non-empty-string> $attributesToSearchOn
     *
     * @return $this
     */
    public function setAttributesToSearchOn(array $attributesToSearchOn) : self
    {
        $this->attributesToSearchOn = $attributesToSearchOn;
        return $this;
    }
    /**
     * @return $this
     */
    public function setExhaustiveFacetsCount(bool $exhaustiveFacetsCount) : self
    {
        $this->exhaustiveFacetsCount = $exhaustiveFacetsCount;
        return $this;
    }
    /**
     * @return array{
     *     facetName?: non-empty-string,
     *     facetQuery?: non-empty-string,
     *     q?: string,
     *     filter?: list<non-empty-string|list<non-empty-string>>,
     *     matchingStrategy?: 'last'|'all'|'frequency'|null,
     *     attributesToSearchOn?: non-empty-list<non-empty-string>,
     *     exhaustiveFacetsCount?: bool
     * }
     */
    public function toArray() : array
    {
        return \array_filter(['facetName' => $this->facetName, 'facetQuery' => $this->facetQuery, 'q' => $this->q, 'filter' => $this->filter, 'matchingStrategy' => $this->matchingStrategy, 'attributesToSearchOn' => $this->attributesToSearchOn, 'exhaustiveFacetsCount' => $this->exhaustiveFacetsCount], static function ($item) {
            return null !== $item;
        });
    }
}
