import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

/// 本地存储服务
class LocalStorage {
  LocalStorage._();

  static const String _tokenKey = 'token';
  static const String _userInfoKey = 'userInfo';

  static SharedPreferences? _prefs;

  /// 初始化
  static Future<void> init() async {
    _prefs = await SharedPreferences.getInstance();
  }

  /// 获取实例
  static SharedPreferences get prefs {
    if (_prefs == null) {
      throw Exception('LocalStorage not initialized. Call init() first.');
    }
    return _prefs!;
  }

  // ==================== Token 管理 ====================

  /// 保存 Token
  static Future<void> saveToken(String token) async {
    await prefs.setString(_tokenKey, token);
  }

  /// 获取 Token
  static String? getToken() {
    return prefs.getString(_tokenKey);
  }

  /// 移除 Token
  static Future<void> removeToken() async {
    await prefs.remove(_tokenKey);
  }

  /// 是否已登录
  static bool get isLoggedIn => getToken() != null && getToken()!.isNotEmpty;

  // ==================== 用户信息管理 ====================

  /// 保存用户信息
  static Future<void> saveUserInfo(Map<String, dynamic> userInfo) async {
    await prefs.setString(_userInfoKey, jsonEncode(userInfo));
  }

  /// 获取用户信息
  static Map<String, dynamic>? getUserInfo() {
    final str = prefs.getString(_userInfoKey);
    if (str == null) return null;
    try {
      return jsonDecode(str) as Map<String, dynamic>;
    } catch (e) {
      return null;
    }
  }

  /// 移除用户信息
  static Future<void> removeUserInfo() async {
    await prefs.remove(_userInfoKey);
  }

  // ==================== 通用方法 ====================

  /// 保存字符串
  static Future<void> setString(String key, String value) async {
    await prefs.setString(key, value);
  }

  /// 获取字符串
  static String? getString(String key) {
    return prefs.getString(key);
  }

  /// 保存布尔值
  static Future<void> setBool(String key, bool value) async {
    await prefs.setBool(key, value);
  }

  /// 获取布尔值
  static bool? getBool(String key) {
    return prefs.getBool(key);
  }

  /// 清除所有数据
  static Future<void> clearAll() async {
    await prefs.clear();
  }

  /// 清除用户数据（退出登录时调用）
  static Future<void> clearUserData() async {
    await removeToken();
    await removeUserInfo();
  }
}
