<?php
namespace api\validators;

use common\helpers\Error as E;
use common\models\EmailActivation;
use yii\validators\Validator;

/**
 * Валидатор для проверки полученного от пользователя кода активации.
 * В случае успешной валидации подменяет значение поля на актуальную модель
 */
class EmailActivationKeyValidator extends Validator {

    /**
     * @var int тип ключа. Если не указан, то валидирует по всем ключам.
     */
    public $type;

    public $keyRequired = E::KEY_REQUIRED;

    public $notExist = E::KEY_NOT_EXISTS;

    public $expired = E::KEY_EXPIRE;

    public $skipOnEmpty = false;

    public function validateAttribute($model, $attribute) {
        $value = $model->$attribute;
        if (empty($value)) {
            $this->addError($model, $attribute, $this->keyRequired);
            return;
        }

        $activation = $this->findEmailActivationModel($value, $this->type);
        if ($activation === null) {
            $this->addError($model, $attribute, $this->notExist);
            return;
        }

        if ($activation->isExpired()) {
            $this->addError($model, $attribute, $this->expired);
            return;
        }

        $model->$attribute = $activation;
    }

    protected function findEmailActivationModel(string $key, int $type = null): ?EmailActivation {
        $query = EmailActivation::find();
        $query->andWhere(['key' => $key]);
        if ($type !== null) {
            $query->andWhere(['type' => $type]);
        }

        return $query->one();
    }

}