<?php

declare(strict_types=1);

namespace app\models;

use yii;
use yii\web\IdentityInterface;

use app\models\traits\SearchByEdge;

/**
 * Поиск
 *
 * @see Product Поиск по товарам
 */
class Search extends Document
{
    use SearchByEdge;

    /**
     * Имя коллекции
     */
    public static function collectionName(): string
    {
        return 'search';
    }

    /**
     * Свойства
     */
    public function attributes(): array
    {
        return array_merge(
            parent::attributes(),
            [
                'text',
                'type',
                'ipv4',
                'head'
            ]
        );
    }

    /**
     * Метки свойств
     */
    public function attributeLabels(): array
    {
        return array_merge(
            parent::attributeLabels(),
            [
                'text' => 'Текст',
                'type' => 'Тип',
                'ipv4' => 'IPv4',
                'head' => 'Заголовки'
            ]
        );
    }

    /**
     * Правила
     */
    public function rules(): array
    {
        return array_merge(
            parent::rules(),
            [
                [
                    'text',
                    'required'
                ],
                [
                    'ipv4',
                    'default',
                    'value' => yii::$app->request->userIP
                ],
                [
                    'head',
                    'default',
                    'value' => yii::$app->request->getHeaders()
                ]
            ]
        );
    }

    /**
     * Запись
     *
     * @param string $text Текст запроса
     * @param string $type Тип запроса
     * @param Account|null $account Пользователь совершивший запрос
     */
    public static function write(string $text, string $type = 'general', Account|null $account = null): ?self
    {
        // Инициализация
        $vertex = new self;
        isset($account) && yii::$app->user->isGuest ?: $account = yii::$app->user->identity;

        // Настройки
        $vertex->text = $text;
        $vertex->type = $type;

        if ($vertex->save()) {
            // Поиск записан

            // Запись ребра: АККАУНТ -> ПОИСК
            return $account && AccountEdgeSearch::writeSafe($account->id, $vertex->readId(), 'request') ? $vertex : null;
        }

        return null;
    }
}
