<?php
namespace api\models\authentication;

use api\models\base\ApiForm;
use common\helpers\Error as E;
use common\models\AccountSession;
use Yii;

class RefreshTokenForm extends ApiForm {

    public $refresh_token;

    /**
     * @var AccountSession|null
     */
    private $session;

    public function rules() {
        return [
            ['refresh_token', 'required', 'message' => E::REFRESH_TOKEN_REQUIRED],
            ['refresh_token', 'validateRefreshToken'],
        ];
    }

    public function validateRefreshToken() {
        if (!$this->hasErrors()) {
            /** @var AccountSession|null $token */
            if ($this->getSession() === null) {
                $this->addError('refresh_token', E::REFRESH_TOKEN_NOT_EXISTS);
            }
        }
    }

    /**
     * @return \api\components\User\RenewResult|bool
     */
    public function renew() {
        if (!$this->validate()) {
            return false;
        }

        /** @var \api\components\User\Component $component */
        $component = Yii::$app->user;

        return $component->renew($this->getSession());
    }

    /**
     * @return AccountSession|null
     */
    public function getSession() {
        if ($this->session === null) {
            $this->session = AccountSession::findOne(['refresh_token' => $this->refresh_token]);
        }

        return $this->session;
    }

}