<?php

namespace Xentral\Widgets\SuperSearch\Result;

use JsonSerializable;
use Xentral\Widgets\SuperSearch\Exception\InvalidArgumentException;

final class ResultItem implements JsonSerializable
{
    /** @var int|string $identifier */
    private $identifier;

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

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

    /** @var string|null $subTitle */
    private $subTitle;

    /** @var array|string[] $additionalInfos */
    private $additionalInfos = [];

    /**
     * @param int|string  $identifier Database-ID or unique keyword
     * @param string      $title
     * @param string      $link
     * @param string|null $subTitle
     * @param array|null  $additionalInfos
     */
    public function __construct($identifier, $title, $link, $subTitle = null, array $additionalInfos = null)
    {
        if (empty($identifier)) {
            throw new InvalidArgumentException('Parameter "id" is empty.');
        }
        if (empty($title)) {
            throw new InvalidArgumentException('Parameter "title" is empty.');
        }
        if (empty($link)) {
            throw new InvalidArgumentException('Parameter "link" is empty.');
        }

        $this->identifier = $identifier;
        $this->title = (string)$title;
        $this->link = (string)$link;

        $subTitle = trim($subTitle);
        if ($subTitle !== '') {
            $this->subTitle = $subTitle;
        }

        $additionalInfos = (array)$additionalInfos;
        foreach ($additionalInfos as $additionalInfo) {
            $additionalInfo = trim($additionalInfo);
            if ($additionalInfo !== '') {
                $this->additionalInfos[] = $additionalInfo;
            }
        }
    }

    /**
     * @param array $state
     *
     * @return self
     */
    public static function fromDbState(array $state)
    {
        $additionalInfos = explode(' ## ' , $state['additional_infos']);

        return new self($state['index_id'], $state['title'], $state['link'], $state['subtitle'], $additionalInfos);
    }

    /**
     * @return int
     */
    public function getIdentifier()
    {
        return $this->identifier;
    }

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

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

    /**
     * @return string|null
     */
    public function getSubTitle()
    {
        return $this->subTitle;
    }

    /**
     * @return array
     */
    public function getAdditionalInfos()
    {
        return $this->additionalInfos;
    }

    /**
     * @return array
     */
    public function jsonSerialize()
    {
        return [
            'type'            => 'default',
            'identifier'      => $this->identifier,
            'title'           => $this->title,
            'link'            => $this->link,
            'subtitle'        => $this->subTitle,
            'additionalInfos' => !empty($this->additionalInfos) ? $this->additionalInfos : null,
        ];
    }
}