/**
 * Web Storage Adapter
 *
 * 基于 localStorage 的存储适配器实现
 */

import { IStorageAdapter, StorageKey } from './interface';
import { logger } from '../../utils/logger';

export class WebStorageAdapter implements IStorageAdapter {
  private storage: Storage;

  constructor(storage: Storage = localStorage) {
    this.storage = storage;
  }

  async getItem<T = string>(key: StorageKey | string): Promise<T | null> {
    try {
      const value = this.storage.getItem(key);
      if (value === null) {
        return null;
      }

      // 尝试解析 JSON
      try {
        return JSON.parse(value) as T;
      } catch {
        // 如果不是 JSON，返回原始字符串
        // 这处理了像 "light" 这样的简单字符串值
        return value as T;
      }
    } catch (error) {
      logger.error('WebStorage', `Failed to get item: ${key}`, error);
      return null;
    }
  }

  async setItem<T = any>(key: StorageKey | string, value: T): Promise<void> {
    try {
      const stringValue = typeof value === 'string' ? value : JSON.stringify(value);
      this.storage.setItem(key, stringValue);
    } catch (error) {
      logger.error('WebStorage', `Failed to set item: ${key}`, error);
      throw error;
    }
  }

  async removeItem(key: StorageKey | string): Promise<void> {
    try {
      this.storage.removeItem(key);
    } catch (error) {
      logger.error('WebStorage', `Failed to remove item: ${key}`, error);
      throw error;
    }
  }

  async clear(): Promise<void> {
    try {
      this.storage.clear();
    } catch (error) {
      logger.error('WebStorage', 'Failed to clear storage', error);
      throw error;
    }
  }

  async keys(): Promise<string[]> {
    try {
      return Object.keys(this.storage);
    } catch (error) {
      logger.error('WebStorage', 'Failed to get storage keys', error);
      return [];
    }
  }
}
