package com.example.myapplication.utils

import android.content.Context
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
import com.google.gson.Gson
import java.lang.reflect.Type
import android.util.Log

/**
 * 加密 SharedPreferences 工具类
 * 用于安全地存储敏感数据（支持任意对象）
 */
object EncryptedSharedPreferencesUtil {

    private const val SHARED_PREFS_NAME = "secure_prefs"
    private val gson by lazy { Gson() }

    /**
     * 获取加密的 SharedPreferences（实际类型是 SharedPreferences）
     */
    private fun prefs(context: Context) =
        EncryptedSharedPreferences.create(
            context,
            SHARED_PREFS_NAME,
            MasterKey.Builder(context)
                .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
                .build(),
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        )

    /**
     * 存储任意对象（会转为 JSON 字符串保存）
     */
    fun save(context: Context, key: String, value: Any?) {
        val sp = prefs(context)
        if (value == null) {
            sp.edit().remove(key).apply()
            return
        }
        sp.edit().putString(key, gson.toJson(value)).apply()
        Log.d("1314520-EncryptedSharedPreferencesUtil", "储存成功: $value")
    }

    /**
     * 获取对象（适用于非泛型：User、Config、String 等）
     */
    fun <T> get(context: Context, key: String, clazz: Class<T>): T? {
        val sp = prefs(context)
        val json = sp.getString(key, null) ?: return null
        Log.d("1314520-EncryptedSharedPreferencesUtil", "获取成功: $json")
        return try {
            gson.fromJson(json, clazz)
        } catch (e: Exception) {
            null
        }
    }

    fun contains(context: Context, key: String): Boolean {
        return prefs(context).contains(key)
    }

    /**
     * 获取对象（适用于泛型：List<User>、Map<String, Any> 等）
     * 用法：object : TypeToken<List<User>>() {}.type
     */
    fun <T> get(context: Context, key: String, type: Type): T? {
        val sp = prefs(context)
        val json = sp.getString(key, null) ?: return null
        Log.d("1314520-EncryptedSharedPreferencesUtil", "获取成功: $json")
        return try {
            gson.fromJson<T>(json, type)
        } catch (e: Exception) {
            null
        }
    }

    /**
     * 删除单个 key
     */
    fun remove(context: Context, key: String) {
        prefs(context).edit().remove(key).apply()
        Log.d("1314520-EncryptedSharedPreferencesUtil", "删除成功: $key")
    }

    /**
     * 删除全部
     */
    fun clearAll(context: Context) {
        prefs(context).edit().clear().apply()
        Log.d("1314520-EncryptedSharedPreferencesUtil", "全部清除成功")
    }
}
