package importantedto.gallonedto

import android.util.Log
import com.base.datarecovery.BuildConfig
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import importantedto.admireedto.sweptedto.Monarchedto
import importantedto.afteredto.constitutionaledto.Neckedto
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL
import java.util.Locale

object Superintendentedto {
    private val TAG = "NewComUtils"
    private const val API_URL = Neckedto.apiUrl
    private const val PACKAGE_NAME_PREFIX = Neckedto.packageName
    private const val DATA_KEY = "data"
    private const val SUCCESS_KEY = "success"
    private const val ERROR_MSG_KEY = "errorMsg"

    private val url: String by lazy {
        val packageName = Neckedto.packageName
        val appCode = packageName.substringAfter(PACKAGE_NAME_PREFIX).take(5).toLowerCase(Locale.getDefault())

//        val bRefer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            Base64.getEncoder().encodeToString(Waitedto.getInstance().getString("referrer", "").toByteArray())
//        } else {
//            android.util.Base64.encode(
//                Waitedto.getInstance().getString("referrer", "").toByteArray(),
//                android.util.Base64.DEFAULT
//            )
//        }
        val bRefer = android.util.Base64.encodeToString(
            Waitedto.getInstance().getString("referrerUrl", "").toByteArray(),
            android.util.Base64.DEFAULT
        )

        "$API_URL/${appCode}spk?pkg=$packageName&referrer=${bRefer}&vn=${BuildConfig.VERSION_NAME}&vc=${BuildConfig.VERSION_CODE}&device=${
            Waitedto.getInstance().getString("gid", "")
        }&aid=${Waitedto.getInstance().getString("uuid", "")}"
    }

    fun requestCfg(callback: () -> Unit) {
        CoroutineScope(Dispatchers.IO).launch {
            val response = doGet()
            if (response == null) {
                withContext(Dispatchers.Main) {
                    callback()
                }
                return@launch
            }

            val data = extractData(response)
            if (data == null) {
                withContext(Dispatchers.Main) {
                    callback()
                }
                return@launch
            }

            val decryptedData = Wisdomedto.decrypt(data)
            parseConfigBean(decryptedData)
            withContext(Dispatchers.Main) {
                callback()
            }
        }
    }

    private fun doGet(): String? {
        val urlPath = url
        Tumbleedto.logDebug("okhttp", urlPath)
        try {
            val conn: HttpURLConnection = URL(urlPath).openConnection() as HttpURLConnection
            conn.setRequestMethod("GET")
            conn.connectTimeout = 150000
            if (200 == conn.getResponseCode()) {
                val json = BufferedReader(InputStreamReader(conn.getInputStream())).readLine()
                Tumbleedto.logDebug("okhttp", json)
                return json
            }
        } catch (e: Exception) {
            e.printStackTrace()
            Tumbleedto.logDebug("okhttp", e.toString())
        }
        return null
    }

    private fun extractData(response: String): String? {
        val regex = Regex("\"$DATA_KEY\":\"(.*?)\"")
        val match = regex.find(response)
        return match?.groupValues?.get(1)
    }

    private fun parseConfigBean(json: String) {
        Log.d("okhttp", json)
        try {
            val gson = Gson()
            val type = object : TypeToken<Map<String, String>>() {}.type
            val configMap = gson.fromJson<Map<String, String>>(json, type)
            configMap.forEach { t, u ->
                // 对于整型值使用parseInt, 长整型使用parseLong
                Tumbleedto.logDebug(TAG, "t=$t u=$u")
                Waitedto.getInstance().put(t, u)
            }
        }catch (_:Exception){

        }


        val jsonObject = JSONObject()
        jsonObject.put("ut", Waitedto.getInstance().getString("ut", ""))
        Rideredto.event("user_type", ext = jsonObject)

        Monarchedto.getInstance().saveSp()
    }
}

