/**
 * Token管理模块
 * 负责Token的存储、获取、刷新和过期处理
 */

import { Storage } from '../utils/storage';

/**
 * Token存储键名常量
 */
const TOKEN_KEY_PREFIX = 'token_';

/**
 * Token管理类
 * 提供Token的增删改查功能
 */
export class TokenManager {
  private readonly storage: Storage;
  private readonly tokenKey: string;
  private readonly fullTokenKey: string;

  /**
   * 构造函数
   * @param storage 存储实例
   * @param clientId 客户端ID，用于生成唯一的Token键名
   */
  constructor(storage: Storage, clientId: string) {
    if (!storage) {
      throw new Error('Storage instance is required');
    }
    
    if (!clientId || typeof clientId !== 'string') {
      throw new Error('Client ID must be a non-empty string');
    }

    this.storage = storage;
    this.tokenKey = clientId;
    this.fullTokenKey = `${TOKEN_KEY_PREFIX}${clientId}`;
  }

  /**
   * 存储Token信息
   * @param token Token字符串
   * @throws {Error} 当token为空或非字符串时抛出错误
   */
  saveToken(token: string): void {
    if (!token) {
      throw new Error('Token must be a non-empty string');
    }
    
    this.storage.set(this.fullTokenKey, token);
  }

  /**
   * 获取Token信息
   * @returns string | null 返回Token字符串或null
   */
  getToken(): string | null {
    return this.storage.get(this.fullTokenKey);
  }

  /**
   * 清除Token信息
   */
  clearToken(): void {
    this.storage.remove(this.fullTokenKey);
  }

  /**
   * 检查Token是否存在
   * @returns boolean Token是否存在
   */
  hasToken(): boolean {
    return this.getToken() !== null;
  }

  /**
   * 获取客户端ID
   * @returns string 客户端ID
   */
  getClientId(): string {
    return this.tokenKey;
  }

  /**
   * 获取完整的Token键名
   * @returns string 完整的Token键名
   */
  getFullTokenKey(): string {
    return this.fullTokenKey;
  }
}
