<?php
declare(strict_types=1);

namespace api\tests;

use api\tests\_generated\FunctionalTesterActions;
use Codeception\Actor;
use common\models\Account;
use InvalidArgumentException;
use Yii;

class FunctionalTester extends Actor {
    use FunctionalTesterActions;

    public function amAuthenticated(string $asUsername = 'admin') { // Do not declare type
        /** @var Account $account */
        $account = Account::findOne(['username' => $asUsername]);
        if ($account === null) {
            throw new InvalidArgumentException("Cannot find account with username \"{$asUsername}\"");
        }

        $token = Yii::$app->tokensFactory->createForWebAccount($account);
        $this->amBearerAuthenticated((string)$token);

        return $account->id;
    }

    public function notLoggedIn(): void {
        $this->haveHttpHeader('Authorization', null);
        Yii::$app->user->logout();
    }

    public function canSeeAuthCredentials($expectRefreshToken = false): void {
        $this->canSeeResponseJsonMatchesJsonPath('$.access_token');
        $this->canSeeResponseJsonMatchesJsonPath('$.expires_in');
        if ($expectRefreshToken) {
            $this->canSeeResponseJsonMatchesJsonPath('$.refresh_token');
        } else {
            $this->cantSeeResponseJsonMatchesJsonPath('$.refresh_token');
        }
    }

}