<?php

/*
 * This file is part of the ONGR package.
 *
 * (c) NFQ Technologies UAB <info@nfq.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ONGR\ElasticsearchDSL\Suggest;

use ONGR\ElasticsearchDSL\BuilderInterface;
use ONGR\ElasticsearchDSL\ParametersTrait;
use Symfony\Component\Serializer\Exception\InvalidArgumentException;

class Suggest implements BuilderInterface
{
    use ParametersTrait;

    const TERM = 'term';
    const COMPLETION = 'completion';
    const PHRASE = 'phrase';
    const CONTEXT = 'completion';

    /**
     * @var string
     */
    private $name;

    /**
     * @var string
     */
    private $type;

    /**
     * @var string
     */
    private $field;

    /**
     * @var string
     */
    private $text;

    /**
     * TermSuggest constructor.
     * @param string $name
     * @param string $field
     * @param string $type
     * @param string $text
     * @param array $parameters
     */
    public function __construct($name, $field, $type, $text, $parameters = [])
    {
        $this->setName($name);
        $this->validateType($type);
        $this->setField($field);
        $this->setType($type);
        $this->setText($text);
        $this->setParameters($parameters);
    }

    /**
     * Returns element type.
     *
     * @return string
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * @param string $type
     */
    public function setType($type)
    {
        $this->type = $type;
    }

    /**
     * @return string
     */
    public function getText()
    {
        return $this->text;
    }

    /**
     * @param string $text
     */
    public function setText($text)
    {
        $this->text = $text;
    }

    /**
     * @return string
     */
    public function getField()
    {
        return $this->field;
    }

    /**
     * @param string $field
     */
    public function setField($field)
    {
        $this->field = $field;
    }

    /**
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Returns suggest name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Checks if the type is valid
     *
     * @param string $type
     *
     * @return bool
     *
     * @throws InvalidArgumentException
     */
    private function validateType($type)
    {
        if (in_array($type, [
            self::COMPLETION,
            self::CONTEXT,
            self::PHRASE,
            self::TERM
        ])) {
            return true;
        }
        throw new InvalidArgumentException(
            'You must provide a valid type to the Suggest()'
        );
    }

    /**
     * {@inheritdoc}
     */
    public function toArray()
    {
        $output = [
            $this->getName() => [
                'text' => $this->getText(),
                $this->getType() => $this->processArray(['field' => $this->getField()]),
            ]
        ];

        return $output;
    }
}