package com.base.filerecoveryrecyclebin.activity.battery

import android.annotation.SuppressLint
import android.content.Intent
import android.content.IntentFilter
import android.graphics.Color
import android.os.BatteryManager
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import com.base.filerecoveryrecyclebin.activity.ResultActivity
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.bean.ConstObject.BATTERY_INFO
import com.base.filerecoveryrecyclebin.databinding.ActivityBatteryBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.receiver.BatteryReceiver
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import kotlin.math.abs


class BatteryActivity : BaseActivity<ActivityBatteryBinding>() {

    private val TAG = "BatteryActivity"

    override val binding: ActivityBatteryBinding by lazy {
        ActivityBatteryBinding.inflate(layoutInflater)
    }
    private lateinit var batteryReceiver: BatteryReceiver

    private lateinit var mBatteryManager: BatteryManager

    @SuppressLint("SetTextI18n")
    override fun initView() {
        BarUtils.setStatusBarLightMode(this, true)
        BarUtils.setStatusBarColor(this, Color.parseColor("#FAFAFA"))
        binding.root.updatePadding(top = BarUtils.getStatusBarHeight())

        batteryReceiver = BatteryReceiver {
            updateUi()
        }
        registerReceiver(batteryReceiver, IntentFilter().apply {
            addAction("android.intent.action.BATTERY_CHANGED")
        })

        mBatteryManager = getSystemService(BATTERY_SERVICE) as BatteryManager

//        getAverageCurrent()
//
//        lifecycleScope.launch(Dispatchers.Main) {
//            currentFlow.collectLatest {
//                binding.tvElectric.text = "${it}mA"
//            }
//        }
//        lifecycleScope.launch(Dispatchers.Main) {
//            averageFlow.collectLatest {
//                binding.tvCurrentAverage.text = "${it}mA"
//            }
//        }

        AdmobMaxHelper.admobMaxShowNativeAd(this, binding.flAd, 2)
    }

    override fun initListener() {
        super.initListener()
        onBackPressedDispatcher.addCallback {
            finishToMain()
        }
        binding.flFanhui.setOnClickListener {
            onBackPressedDispatcher.onBackPressed()
        }
        binding.tvFinish.setOnClickListener {
            startActivity(Intent(this, ResultActivity::class.java).apply {
                putExtra("from", BATTERY_INFO)
            })
            finish()
        }
    }

    @SuppressLint("SetTextI18n")
    private fun updateUi() {
        val temperature = BatteryReceiver.temperature / 10f
        binding.tvTemperature.text = format(temperature) + " °C"

        binding.tvVoltage.text = "${format((BatteryReceiver.voltage / 1000f))} mV"

        binding.tvTechnology.text = BatteryReceiver.technology

        val capacity = BatteryReceiver.mAh.toInt()
        binding.tvCapacity.text = "$capacity mAh"

        val currentNow = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW)
        binding.tvElectric.text = "${getFirstThreeDigits(currentNow * 100)} mA"

        val currentAverage: Int = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE)
        binding.tvCurrentAverage.text = "${getFirstThreeDigits(currentAverage * 100)} mA"

        val hm = (capacity.toFloat() / getFirstThreeDigits(currentNow * 100).toFloat())

        binding.tvH.text = abs(hm.toInt()).toString()
        binding.tvM.text = abs(((hm - hm.toInt()) * 60).toInt()).toString()
    }

    private fun getFirstThreeDigits(number: Int): String {
        if (number == 0) {
            return "0"
        }
        return number.toString().take(3)
    }

    private fun format(float: Float): String {
        return "%.1f".format(float)
    }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(batteryReceiver)
    }


//    @SuppressLint("PrivateApi")
//    fun getBatteryFilePath(): String {
//        val systemProperties = Class.forName("android.os.SystemProperties")
//        val getMethod = systemProperties.getDeclaredMethod("get", String::class.java)
//        val platName = getMethod.invoke(null, "ro.hardware") as String
//
//        LogEx.logDebug(TAG, "platName=$platName")
//        val filePath: String = if (platName.startsWith("mt") || platName.startsWith("MT")) {
//            "/sys/class/power_supply/battery/device/FG_Battery_CurrentConsumption"
//            // MTK平台该值不区分充放电，都为负数
//        } else if (platName.startsWith("qcom")) {
//            "/sys/class/power_supply/battery/current_now"
//        } else if (platName.startsWith("exynos"))
//            "/sys/class/power_supply/battery/BatteryAverageCurrent"
//        else {
//            ""
//        }
//        LogEx.logDebug(TAG, "filePath=$filePath")
//        return filePath
//    }


//    var mAverageFlow = MutableSharedFlow<Float>()
//    val averageFlow: SharedFlow<Float> = mAverageFlow
//
//    var mCurrentFlow = MutableSharedFlow<Int>()
//    var currentFlow: SharedFlow<Int> = mCurrentFlow


//    private fun getAverageCurrent(filePath: String = getBatteryFilePath()) {
//        var sum = 0
//        var loopCount = 0
//        lifecycleScope.launch(Dispatchers.IO) {
//            while (isActive) {
//                val currentValue = readFileValue(filePath)
//                mCurrentFlow.emit(currentValue)
//                sum += currentValue
//                loopCount++
//                val average = sum / loopCount.toFloat()
//                mAverageFlow.emit(average)
//                delay(150)
//            }
//        }
//    }


//    private fun readFileValue(filePath: String): Int {
//        var value = 0
//        var br: BufferedReader? = null
//        try {
//            br = BufferedReader(FileReader(filePath))
//            val line = br.readLine()
//            value = line?.toInt() ?: 0
//            LogEx.logDebug(TAG, "readFileValue value=$value")
//        } catch (e: Exception) {
//            e.printStackTrace()
//        } finally {
//            br?.close()
//        }
//        return value
//    }

}