<?php

declare(strict_types=1);

namespace app\models;

use yii;

use mirzaev\yii2\arangodb\ActiveRecord;

use Exception;

/**
 * Документ
 */
abstract class Document extends ActiveRecord
{
    /**
     * Имя коллекции
     */
    public static function collectionName(): string
    {
        return throw new Exception('Не установлено название коллекции');
    }

    /**
     * Свойства
     */
    public function attributes(): array
    {
        return [
            '_key',
            'date',
            'wrtr'
        ];
    }

    /**
     * Метки свойств
     */
    public function attributeLabels(): array
    {
        return [
            '_key' => 'Ключ',
            'date' => 'Дата',
            'wrtr' => 'Аккаунт записавшего'
        ];
    }


    /**
     * Правила
     *
     * @todo Добавить проверку существования аккаунта
     */
    public function rules(): array
    {
        return [
            [
                'wrtr',
                'string'
            ],
            [
                'wrtr',
                'default',
                'value' => yii::$app->user->id
            ],
            [
                'date',
                'default',
                'value' => time()
            ]
        ];
    }

    /**
     * Чтение идентификатора
     */
    public function readId(): ?string
    {
        return isset($this->_key) && static::collectionName() ? static::collectionName() . '/' . $this->_key : null;
    }

    /**
     * Поиск по идентификатору
     */
    public static function searchById(string $_id): ?static
    {
        return static::findOne(['_id' => $_id]);
    }

    public static function readLast(): ?static
    {
        return static::find()->orderBy(['DESC'])->one();
    }

    /**
     * Чтение всех записей
     */
    public static function readAll(): array
    {
        return static::find()->all();
    }

    /**
     * Чтение количества записей
     */
    public static function readAmount(): int
    {
        return static::find()->count();
    }

    /**
     * Проверка на то, что в свойство передан массив
     */
    public function arrayValidator(string $attribute, array $params = null): bool
    {
        if (is_array($this->$attribute)) {
            return true;
        }

        return false;
    }
}
