package com.stove.unity

import androidx.annotation.Keep
import com.stove.auth.googleplaygames.*
import com.stove.base.json.putIgnoreException
import com.stove.base.log.Logger
import com.stove.base.result.Result
import com.unity3d.player.UnityPlayer
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject

@Keep
object GPGProviderWrapper {

    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 fetch(sessionId: String, identifier: String) {
        val context = UnityPlayer.currentActivity.applicationContext

        val provider = GPGProvider(sessionId)
        provider.fetch(context) { result, list ->
            val jsonObject = JSONObject()
            jsonObject.putIgnoreException(IdentifierKey, identifier)

            val valueJSONObject = JSONObject()
            valueJSONObject.putIgnoreException(ResultKey, result.toJSONObject())
            valueJSONObject.putIgnoreException("accounts", list)

            jsonObject.putIgnoreException(ValueKey, valueJSONObject)
            val params = jsonObject.toString()
            UnityPlayer.UnitySendMessage(objectName, functionName, params)
        }
    }

    @JvmStatic
    fun load(sessionId: String, account: String, identifier: String) {
        val activity = UnityPlayer.currentActivity

        val accountJSONObject = JSONObject(account)
        val provider = GPGProvider(sessionId)
        provider.load(activity, accountJSONObject) { result, loadProvider ->
            val jsonObject = JSONObject()
            jsonObject.putIgnoreException(IdentifierKey, identifier)

            val valueJSONObject = JSONObject()
            valueJSONObject.putIgnoreException(ResultKey, result.toJSONObject())
            valueJSONObject.putIgnoreException("provider", loadProvider?.toJSONObject())

            jsonObject.putIgnoreException(ValueKey, valueJSONObject)
            val params = jsonObject.toString()
            UnityPlayer.UnitySendMessage(objectName, functionName, params)
        }
    }
}
