package com.stove.unity

import android.content.Context
import androidx.annotation.Keep
import com.stove.base.constants.Constants
import com.stove.base.constants.BuildConfiguration
import com.stove.base.json.putIgnoreException
import com.stove.base.localization.Language
import com.stove.base.localization.Localization
import com.stove.base.log.Logger
import com.stove.base.sharedPrefrences.remove
import com.unity3d.player.UnityPlayer
import org.json.JSONObject
import com.stove.base.log.model.LogLevel
import com.stove.base.log.model.LogTag
import com.stove.base.log.model.logTagList

@Keep
object BaseWrapper {
    private const val TAG = "BaseWrapper"
    private const val objectName = "StoveSDK"
    private const val functionName = "CallMessage"
    private const val IdentifierKey = "identifier"
    private const val ValueKey = "value"
    private const val ResultKey = "result"

    @JvmStatic
    fun setLanguage(ordinal: Int) {
        val context = UnityPlayer.currentActivity.applicationContext
        val language = Language.from(ordinal)
        if (language == null) {
            Logger.trace(
                LogLevel.ERROR,
                "$TAG.setLanguage",
                logTagList("language is null")
            )
            return
        }
        Localization.setLanguage(context, language)
    }

    @JvmStatic
    fun getLanguage(): Int {
        val context = UnityPlayer.currentActivity.applicationContext
        return Localization.getLanguage(context).ordinal
    }

    @JvmStatic
    fun get(key: String): String {
        return Constants.get(key, "")
    }

    @JvmStatic
    fun get(key: String, default: Boolean): Boolean {
        return Constants.get(key, default)
    }

    @JvmStatic
    fun initialize(zone: String, identifier: String) {
        val context = UnityPlayer.currentActivity.applicationContext

        context.getSharedPreferences("com.stove.base.constants", Context.MODE_PRIVATE).remove(context, "constants")

        Constants.init(context, context.packageName, zone) { result ->
            val jsonObject = JSONObject()
            jsonObject.putIgnoreException(IdentifierKey, identifier)
            val valueJSONObject = JSONObject()
            valueJSONObject.putIgnoreException(ResultKey, result.toJSONObject())
            jsonObject.putIgnoreException(ValueKey, valueJSONObject)
            val params = jsonObject.toString()
            UnityPlayer.UnitySendMessage(objectName, functionName, params)
        }
    }

    @JvmStatic
    fun getVersion(): String? {
        val version : String? = com.stove.base.BuildConfig.VERSION_NAME
        return version
    }

    @JvmStatic
    fun setBuildConfiguration(buildConfiguration:String) {
        val buildConfiguration = BuildConfiguration.from(buildConfiguration)
        buildConfiguration?.let {
            Constants.setBuildConfiguration(it)
        }
    }
}
