package com.vpn.fastestvpnservice.viewmodels

import android.content.Context
import android.content.pm.ActivityInfo
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.vpn.fastestvpnservice.beans.DataResponseServers
import com.vpn.fastestvpnservice.beans.ServerData
import com.vpn.fastestvpnservice.constants.AppEnum
import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
import com.vpn.fastestvpnservice.openVpnUtils.EncryptData
import com.vpn.fastestvpnservice.retrofit.RetrofitNetworkHandling
import com.vpn.fastestvpnservice.retrofit.WebServiceFactory
import com.vpn.fastestvpnservice.screens.isServerModelInitialized
import com.vpn.fastestvpnservice.screens.serverListViewModelSplash
import com.vpn.fastestvpnservice.utils.StaticMethods
import retrofit2.Call
import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader

class SplashViewModel constructor(context: Context): ViewModel() {
    var mutableLiveDataServerData = MutableLiveData<DataResponseServers<ArrayList<ServerData>>>()
    var liveDataServerData: LiveData<DataResponseServers<ArrayList<ServerData>>> = mutableLiveDataServerData

    var mutableLiveDataLanguageStatus = MutableLiveData<Boolean>(false)
    var liveDataLanguageStatus: LiveData<Boolean> = mutableLiveDataLanguageStatus

    var preferenceHelper: BasePreferenceHelper
    var context: Context

    init {
        this.context = context
        preferenceHelper = BasePreferenceHelper(context)

        val jsonAppDetails = getJsonAppDetails()
        val jsonFileDetails = getJsonFileDetails()

        jsonAppDetails?.let {
            val En = EncryptData()
            preferenceHelper.saveAppDetails(En.encrypt(it))
        }
        jsonFileDetails?.let {
            val En = EncryptData()
            preferenceHelper.saveFileDetails(En.encrypt(it))
        }
    }
    fun serverDataApi() {
        Log.d("test_api_response_s", "serverDataApi called()")
        WebServiceFactory.getInstance().serverDataApi().enqueue(
            RetrofitNetworkHandling<Any>(object :
                RetrofitNetworkHandling.ResponseCallback<Any> {
                override fun onSuccess(call: Call<Any>?, response: Any?) {
                    try {
                        val gson = Gson()
                        val jsonString = gson.toJson(response)
                        val type = object : TypeToken<DataResponseServers<ArrayList<ServerData>>>() {}.type
                        val data = gson.fromJson<DataResponseServers<ArrayList<ServerData>>>(jsonString, type)

                        if (data?.status == true) {
                            Log.d("test_api_response_s", "response true")
                            mutableLiveDataServerData.value = data
                            data.data?.let { preferenceHelper.saveServerData(it) }
                            data.wireguard?.let {wg ->
                                if (wg.ip?.isNotEmpty() == true && wg.key?.isNotEmpty() == true){
                                    Log.d("test_wg_data", "WG isNotEmpty")
                                    preferenceHelper.saveWireGuard(wg)
                                } else {
                                    Log.d("test_wg_data", "WG isEmpty")
                                }
                            }
                            data.product?.let {
//                            Log.d("test_api_response", it.productName.toString())
                                preferenceHelper.saveProduct(it)
                            }
                            data.available_protocols.let {
                                preferenceHelper.saveAvailableProtocols(it)
                            }
                            data.enabled_protocols.let {
                                preferenceHelper.saveEnabledProtocols(it)
                            }

                            if (isServerModelInitialized) {
                                Log.d("test_api_response_s", "serverDataApi isServerModelInitialized")
                                if (StaticMethods.isTV(context)) {
                                    Log.d("test_api_response_s", "serverDataApi TV")
                                    serverListViewModelSplash.setCountryDataTV()
                                } else {
                                    Log.d("test_api_response_s", "serverDataApi Android")
                                    serverListViewModelSplash.setRecommendedSmartServers()
                                    serverListViewModelSplash.setCountryData()
                                }
                            }

//                        Log.d("test_api_response", data.data.toString())
//                        Log.d("test_api_response", data.enabled_protocols.toString())
//                        Log.d("test_api_response", data.available_protocols.toString())
                        }
                    } catch (ex: Exception) {
                        Log.d("test_api_response_s", "server catch")
                    }
                }

                override fun onFail(call: Call<Any>?, response: Any?) {
                    Log.d("test_api_response_s", "serverDataApi onFail")
                    mutableLiveDataLanguageStatus.value = false
                }

                override fun onError(call: Call<Any>?, response: Any?) {
                    Log.d("test_api_response_s", "serverDataApi onError")
                    mutableLiveDataLanguageStatus.value = false
                }

            }
            )
        )

    }

    private fun getJsonFileDetails(): String? {
        val protocol = AppEnum.UDP_PROTOCOL.key
        var conf: InputStream? = null
        try {
            conf = if (protocol.equals(AppEnum.TCP_PROTOCOL.key, ignoreCase = true)) {
                context.assets.open("fileDetails/fileDetails.json")
            } else {
                context.assets.open("fileDetails/fileDetails.json")
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        var bufferedReader: BufferedReader? = null
        var isr: InputStreamReader? = null
        try {
            isr = InputStreamReader(conf)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        try {
            bufferedReader = BufferedReader(isr)
            val total = StringBuilder()
            var line: String?
            while (bufferedReader.readLine().also { line = it } != null) {
                total.append(line).append('\n')
            }
            return total.toString()
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ""
    }

    private fun getJsonAppDetails(): String? {
        var conf: InputStream? = null
        try {
            conf = context.assets.open("appDetails/appDetails.json")
        } catch (e: Exception) {
            e.printStackTrace()
        }
        var bufferedReader: BufferedReader? = null
        var isr: InputStreamReader? = null
        try {
            isr = InputStreamReader(conf)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        try {
            bufferedReader = BufferedReader(isr)
            val total = StringBuilder()
            var line: String?
            while (bufferedReader.readLine().also { line = it } != null) {
                total.append(line).append('\n')
            }
            return total.toString()
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ""
    }

}