import 'dart:convert';

import 'package:shared_preferences/shared_preferences.dart';

class SharedUtil {
  SharedPreferences? _prefs;
  static SharedUtil? _instance;

  SharedUtil.of() {
    init();
  }
  SharedUtil._pre(SharedPreferences prefs) {
    _prefs = prefs;
  }

  static SharedUtil getInstance() {
    _instance ??= SharedUtil.of();
    return _instance!;
  }

  void init() async {
    _prefs ??= await SharedPreferences.getInstance();
  }

  static Future<SharedUtil> initShared() async {
    if (_instance == null) {
      var prefs = await SharedPreferences.getInstance();
      _instance = SharedUtil._pre(prefs);
    }
    return _instance!;
  }

  void setData<T>(String key, T data) {
    if (data is String) {
      _prefs?.setString(key, data);
    } else if (data is double) {
      _prefs?.setDouble(key, data);
    } else if (data is int) {
      _prefs?.setInt(key, data);
    } else if (data is bool) {
      _prefs?.setBool(key, data);
    } else if (data is List<String>) {
      _prefs?.setStringList(key, data);
    }
  }

  void setJson(key, value) {
    value = jsonEncode(value);
    _prefs?.setString(key, value);
  }

  Map<String, dynamic>? getJson(key) {
    String? result = _prefs?.getString(key);
    if (result != null) {
      return jsonDecode(result);
    }
    return null;
  }

  void remove(String key) {
    _prefs?.remove(key);
  }

  T? get<T>(String key) {
    var value = _prefs?.get(key);
    if (value != null) {
      return value as T;
    }
    return null;
  }

  List<String> getStringList(String key) {
    var value = _prefs?.getStringList(key);
    if (value != null) {
      return value;
    }
    return [];
  }
}

