/**
 * MiniProgram Storage Adapter
 *
 * 基于 Taro.storage 的存储适配器实现
 */

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

export class MiniprogramStorageAdapter implements IStorageAdapter {
  private Taro: any;

  constructor(Taro: any) {
    this.Taro = Taro;
  }

  async getItem<T = string>(key: StorageKey | string): Promise<T | null> {
    try {
      const result = await this.Taro.getStorage({ key });
      return result.data as T;
    } catch (error) {
      // Taro 在找不到 key 时会抛出异常
      return null;
    }
  }

  async setItem<T = any>(key: StorageKey | string, value: T): Promise<void> {
    try {
      await this.Taro.setStorage({ key, data: value });
    } catch (error) {
      console.error(`Failed to set item ${key}:`, error);
      throw error;
    }
  }

  async removeItem(key: StorageKey | string): Promise<void> {
    try {
      await this.Taro.removeStorage({ key });
    } catch (error) {
      console.error(`Failed to remove item ${key}:`, error);
      throw error;
    }
  }

  async clear(): Promise<void> {
    try {
      await this.Taro.clearStorage();
    } catch (error) {
      console.error('Failed to clear storage:', error);
      throw error;
    }
  }

  async keys(): Promise<string[]> {
    try {
      const result = await this.Taro.getStorageInfo();
      return result.keys || [];
    } catch (error) {
      console.error('Failed to get storage keys:', error);
      return [];
    }
  }
}
