package com.dumpster.cleaner.ui.main

import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.dumpster.cleaner.R
import com.dumpster.cleaner.SpConstObject.mainPageCount
import com.dumpster.cleaner.base.BaseActivity
import com.dumpster.cleaner.base.jumpAction
import com.dumpster.cleaner.bean.FeatureBean.Companion.BATTERY_INFO
import com.dumpster.cleaner.bean.FeatureBean.Companion.JUNK_CLEAN
import com.dumpster.cleaner.bean.HomeTabUIBean
import com.dumpster.cleaner.bean.config.AdConfigBean
import com.dumpster.cleaner.business.ads.AdsMgr
import com.dumpster.cleaner.databinding.ActivityMainBinding
import com.dumpster.cleaner.databinding.ItemHomeTabBinding
import com.dumpster.cleaner.ui.batteryinfo.BatteryReceiver
import com.dumpster.cleaner.ui.dialog.AppExitDialog
import com.dumpster.cleaner.ui.dialog.BatteryUseDialog
import com.dumpster.cleaner.ui.dialog.NotificationTurnOnDialog
import com.dumpster.cleaner.ui.dialog.RateDialog
import com.dumpster.cleaner.ui.dialog.StoragePermissionDialog
import com.dumpster.cleaner.ui.dialog.permissionStorageJump
import com.dumpster.cleaner.ui.recyclebin.RecycleBinFragment
import com.dumpster.cleaner.utils.PermissionUtils.requestNotificationPermission
import com.dumpster.cleaner.utils.PermissionUtils.requestStoragePermission
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch

class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {

    val viewModel by lazy { ViewModelProvider(this)[MainViewModel::class.java] }

    private val fragmentList = listOf(
        Home2Fragment(),
        RecoveryFragment(),
        RecycleBinFragment()
    )

    private val viewPagerAdapter by lazy {
        object : FragmentStateAdapter(this) {
            override fun getItemCount(): Int = fragmentList.size

            override fun createFragment(position: Int): Fragment = fragmentList[position]
        }
    }

    override fun initView() {
        super.initView()

        initTab()
        initViewPager2()
        initDialogFlow()
        AdsMgr.showBanner(binding.flBanner, false)

        val lp = binding.flBottom.layoutParams as ConstraintLayout.LayoutParams
        if (!AdConfigBean.adsConfigBean.isAdShow) {
            lp.setMargins(0, 0, 0, 0)
        } else {
            lp.setMargins(0, 0, 0, resources.getDimensionPixelSize(R.dimen.dp_60))
        }
        binding.flBottom.layoutParams = lp
    }

    private fun initDialogFlow() {
        lifecycleScope.launch {
            viewModel.dialogFlow.collectLatest { dialogType ->

                when (dialogType) {
                    "StoreDialog" -> {
                        val dialog = StoragePermissionDialog(this@MainActivity)
                        dialog.action = {
                            requestStoragePermission(launcher) {
                                viewModel.nextShowDialog = false
                            }
                        }
                        dialog.showDialog()
                    }

                    "NotificationDialog" -> {
                        val dialog = NotificationTurnOnDialog(this@MainActivity)
                        dialog.action = {
                            requestNotificationPermission(launcher) {
                                viewModel.nextShowDialog = false
                            }
                        }
                        dialog.showDialog()
                    }

                    "BatteryDialog" -> {
                        val percent = BatteryReceiver.level / BatteryReceiver.scale.toFloat()
                        val dl = (percent * 100).toInt()
                        val dialog = BatteryUseDialog(this@MainActivity)
                        dialog.action = {
                            jumpAction(BATTERY_INFO)
                        }
                        dialog.showDialog(dl)

                    }

                    "RateDialog" -> {
                        val dialog = RateDialog(this@MainActivity)
                        dialog.showDialog(false)
                    }
                }
            }
        }
    }

    private fun initViewPager2() {
        binding.viewPager2.adapter = viewPagerAdapter
        binding.viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                val defaultTab = binding.tabLayout.getTabAt(position)
                defaultTab?.select()
                defaultTab?.setSelected()
            }
        })
    }

    private fun initTab() {
        arrayOf(
            HomeTabUIBean(R.drawable.tab_clean_selector, getString(R.string.clean)),
            HomeTabUIBean(R.drawable.tab_recovery_selector, getString(R.string.recovery)),
            HomeTabUIBean(R.drawable.tab_recyclebin_selector, getString(R.string.recyclebin)),
        ).forEachIndexed { index, homeTab ->
            val tab = binding.tabLayout.newTab()
            val view = LayoutInflater.from(this).inflate(R.layout.item_home_tab, null)
            val tabBinding = ItemHomeTabBinding.bind(view)
            tabBinding.ivIcon.setImageResource(homeTab.icon)
            tabBinding.tvTab.text = homeTab.tab
//            tabBinding.tvTab.setTextColor(ContextCompat.getColor(this, R.color.color_tab_home))
            tab.customView = tabBinding.root
            tab.id = index
            if (index == 1) {
                tabBinding.vDian.visibility = View.VISIBLE
            } else {
                tabBinding.vDian.visibility = View.GONE
            }
            binding.tabLayout.addTab(tab)
        }
        binding.tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
            override fun onTabSelected(tab: TabLayout.Tab?) {
                tab?.let {
                    if (binding.viewPager2.currentItem == tab.id) return
                    binding.viewPager2.setCurrentItem(tab.id, false)
                }
            }

            override fun onTabUnselected(tab: TabLayout.Tab?) {
                tab?.setUnselected()
            }

            override fun onTabReselected(tab: TabLayout.Tab?) {

            }
        })
    }

    fun TabLayout.Tab.setSelected() {
        val textView = customView?.findViewById<TextView>(R.id.tv_tab)
        textView?.setTextColor(
            ContextCompat.getColor(this@MainActivity, R.color.colorPrimary)
        )
    }

    fun TabLayout.Tab.setUnselected() {
        val textView = customView?.findViewById<TextView>(R.id.tv_tab)
        textView?.setTextColor(Color.parseColor("#999999"))
    }

    override fun onResumeOneShoot() {
        super.onResumeOneShoot()
        mainPageCount = mainPageCount + 1

        viewModel.checkDialog(this)
        viewModel.refreshRecycleBin()
    }


    override fun handleBackCallBack() {
        val dialog = AppExitDialog(this)
        dialog.action = {
            permissionStorageJump(JUNK_CLEAN)
        }
        dialog.showDialog()
    }

}