<?php

declare(strict_types=1);

namespace app\common\library\token;

/**
 * Token 驱动抽象类
 */
abstract class Driver
{
    /**
     * 具体驱动的句柄 Mysql|Redis
     * @var object
     */
    protected object $handler;

    /**
     * @var array 配置数据
     */
    protected array $options = [];

    /**
     * 设置 token
     */
    abstract public function set(string $token, string $type, int $userId, ?int $expire = null): bool;

    /**
     * 获取 token 的数据
     */
    abstract public function get(string $token): array;

    /**
     * 检查 token 是否有效
     */
    abstract public function check(string $token, string $type, int $userId): bool;

    /**
     * 删除一个 token
     */
    abstract public function delete(string $token): bool;

    /**
     * 清理一个用户的所有 token
     */
    abstract public function clear(string $type, int $userId): bool;

    /**
     * 返回句柄对象
     */
    public function handler(): ?object
    {
        return $this->handler;
    }

    protected function getEncryptedToken(string $token): string
    {
        $config = config('buildadmin.token');
        return hash_hmac($config['algo'], $token, $config['key']);
    }

    protected function getExpiredIn(int $expireTime): int
    {
        return $expireTime ? max(0, $expireTime - time()) : 365 * 86400;
    }
}
