package com.iscs.bozzys.utils

import android.app.Application
import com.iscs.bozzys.api.Role
import com.tencent.mmkv.MMKV
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

object Storage {

    /**
     * 操作对象
     */
    private lateinit var mmkv: MMKV

    /**
     * 初始化
     */
    fun init(app: Application) {
        MMKV.initialize(app)
        mmkv = MMKV.defaultMMKV()
    }

    /**
     * 保存当前登录状态
     */
    fun saveLogin(isLogin: Boolean) {
        mmkv.encode("is_login", isLogin)
    }

    /**
     * 是否已经登录
     */
    fun isLogin(): Boolean {
        return mmkv.decodeBool("is_login", false)
    }

    /**
     * 存储token
     */
    fun String?.saveToken() {
        mmkv.encode("user_token", this ?: "")
    }

    /**
     * 获取token
     */
    fun readToken(): String {
        return mmkv.decodeString("user_token", "") ?: ""
    }

    /**
     * 保存刷新token
     */
    fun String?.saveRefreshToken() {
        mmkv.encode("refresh_token", this ?: "")
    }

    /**
     * 读取刷新token
     */
    fun readRefreshToken(): String {
        return mmkv.decodeString("refresh_token", "") ?: ""
    }

    /**
     * 保存用户名
     */
    fun String?.saveUserAvatar() {
        mmkv.encode("user_avatar", this ?: "")
    }

    /**
     * 保存租户ID
     */
    fun String?.saveTenantId() {
        mmkv.encode("tenant_id", this ?: "")
    }

    /**
     * 读取租户ID
     */
    fun readTenantId(): String {
        return mmkv.decodeString("tenant_id", "") ?: ""
    }

    /**
     * 读取用户名
     */
    fun readUserAvatar(): String {
        return mmkv.decodeString("user_avatar", "") ?: ""
    }

    /**
     * 保存角色类型
     */
    fun List<String>.saveRole(): Boolean {
        val str = this.joinToString(separator = ",")
        return mmkv.encode("user_role", str)
    }

    /**
     * 读取用户角色
     */
    fun readRole(): List<String> {
        return (mmkv.decodeString("user_role", "") ?: "").split(",")
    }

    /**
     * 保存当前角色列表
     */
    fun List<Role>?.saveRoleList(): Boolean {
        if (this == null) return false
        val json = Json
        val str = json.encodeToString(this)
        return mmkv.encode("role_list", str)
    }

    /**
     * 读取当前角色
     */
    fun readRoleList(): List<Role> {
        val str = mmkv.decodeString("role_list", "[]") ?: "[]"
        val json = Json
        return json.decodeFromString<List<Role>>(str)
    }

    /**
     * 保存Token生成的向量
     */
    fun ByteArray.saveTokenIv(): Boolean {
        return mmkv.encode("user_token_iv", this)
    }

    /**
     * 保存Token生成的向量产生的值
     */
    fun ByteArray.saveTokenIvValue(): Boolean {
        return mmkv.encode("user_token_iv_value", this)
    }

    /**
     * 读取Token向量
     */
    fun readTokenIv(): ByteArray {
        return mmkv.decodeBytes("user_token_iv", byteArrayOf()) ?: byteArrayOf()
    }

    /**
     * 读取Token向量的值
     */
    fun readTokenIvValue(): ByteArray {
        return mmkv.decodeBytes("user_token_iv_value", byteArrayOf()) ?: byteArrayOf()
    }

    /**
     * 清除缓存数据
     */
    fun clearCache() {
        mmkv.remove("tenant_id")
    }

}