package com.bassbooster.soundeffects.equalizer.view.activity.edgelighting.activity

import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.view.View
import android.widget.SeekBar
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bassbooster.equalizer.R
import com.bassbooster.soundeffects.equalizer.data.model.ColorEdgeModel
import com.bassbooster.equalizer.databinding.ActivityEdgelightBinding
import com.bassbooster.equalizer.databinding.ItemBoderWidthBinding

import com.bassbooster.soundeffects.equalizer.utils.SharedPreferencesUtil

import com.bassbooster.soundeffects.equalizer.utils.Utils
import com.bassbooster.soundeffects.equalizer.view.MainService
import com.bassbooster.soundeffects.equalizer.view.activity.edgelighting.adapter.ColorBorderAdapter
import com.bassbooster.soundeffects.equalizer.view.activity.edgelighting.adapter.ImageBoderAdapter
import com.bassbooster.soundeffects.equalizer.view.activity.edgelighting.customview.ImageBorderView2
import com.bassbooster.soundeffects.equalizer.utils.AppUtils

class EdgeLightingActivity : AppCompatActivity() {
    private lateinit var binding: ActivityEdgelightBinding
    private lateinit var includeBorderWidth: ItemBoderWidthBinding

    private var imageBorderAdapter: ImageBoderAdapter? = null
    private var colorBorderAdapter: ColorBorderAdapter? = null

    private lateinit var sharedPreferencesUtil: SharedPreferencesUtil
    var durationTop: Float? = null
    var durationBottom: Float? = null
    var withSend:Int? = null
    var duration: Int? = null
    var shapePosition: Int? = null
    var colorString: String? = null
//    private var mFirebaseAnalytics: FirebaseAnalytics? = null
//    private var bannerAdHelper: BannerAdHelper? = null

    companion object{
        private const val REQUEST_CODE = 10101
    }

//    val adCallback = object : AdCallback() {
//        override fun onAdClicked() {
//            super.onAdClicked()
//            tracKingFirebaseAnalytics(mFirebaseAnalytics,"Banner_click","click ad tại các màn hình: Edge ","banner_click")
//        }
//
//        override fun onAdImpression() {
//            super.onAdImpression()
//        }
//    }

    @RequiresApi(Build.VERSION_CODES.M)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityEdgelightBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        AppUtils.hideNavigationBar(this)
        includeBorderWidth = ItemBoderWidthBinding.inflate(layoutInflater)
        sharedPreferencesUtil = SharedPreferencesUtil(this)
        // Khởi tạo Firebase Analytics
//        mFirebaseAnalytics = FirebaseAnalytics.getInstance(this)
//        tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_view","User view màn Edge Lighting","edge_lighting_view")

        init()
        setOnEvent()
        loadBanner()
        //kill service overlay when start activity
        launchMainService(false)
    }

    private fun init() {
        initImageBorderStyle()
        initColorBorder()
        sharedPreferencesUtil = SharedPreferencesUtil(this)

        binding.mCheck.isChecked = sharedPreferencesUtil.getStatusWidgetEdge("isCheckPermissionwidget",false)

    }

    @RequiresApi(Build.VERSION_CODES.M)
    private fun setOnEvent() {

        binding.mImgBack.setOnClickListener {
//            tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_back_click","User thoát ra khỏi màn Edge Lighting","edge_lighting_back")
            finish()
        }

        binding.mCheck.apply {
            setOnCheckedChangeListener { _, isCheck ->
                if(isCheck){
//                    tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_allowed_on_other_apps_click","User clicks vào Allow on other apps","on")
                    if(!Settings.canDrawOverlays(this@EdgeLightingActivity)){
                        checkDrawOverlayPermission()
                    }else{
                        sharedPreferencesUtil.saveStatusWidgetEdge("isCheckPermissionwidget",true)
                    }
                }else{
//                    tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_allowed_on_other_apps_click","User clicks vào Allow on other apps","off")
                    sharedPreferencesUtil.saveStatusWidgetEdge("isCheckPermissionwidget",false)
                }

            }
            isChecked = sharedPreferencesUtil.getStatusWidgetEdge("isCheckPermissionwidget")
        }

        val isOverLay = sharedPreferencesUtil.getIsOverLay("isOverLay",false)
        if (isOverLay){
            binding.mOff.background = ContextCompat.getDrawable(this,R.drawable.ic_on)
            binding.includeBorderWidth.mLlBoderWidth.isVisible = true
        }else{
            binding.mOff.background = ContextCompat.getDrawable(this,R.drawable.ic_off)
            binding.includeBorderWidth.mLlBoderWidth.isVisible = false
        }

        binding.mOff.setOnClickListener {
            if (binding.includeBorderWidth.mLlBoderWidth.isVisible) {
//                tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_turn_on_off_click","User clicks vào button ON OFF","off")
                binding.mOff.background = ContextCompat.getDrawable(this,R.drawable.ic_off)
                binding.includeBorderWidth.mLlBoderWidth.visibility = View.GONE
                sharedPreferencesUtil.saveIsOverLay("isOverLay",false)
                val svc = Intent(this, MainService::class.java)
                stopService(svc)
            } else {
//                tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_turn_on_off_click","User clicks vào button ON OFF","on")
                binding.mOff.background = ContextCompat.getDrawable(this,R.drawable.ic_on)
                binding.includeBorderWidth.mLlBoderWidth.visibility = View.VISIBLE
                sharedPreferencesUtil.saveIsOverLay("isOverLay",true)
            }
        }

        binding.mProgressBarTop.setOnSeekBarChangeListener(object :
            SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                // Khi giá trị tiến trình thay đổi (khi vuốt)
                // Bạn có thể làm gì đó với giá trị progress ở đây
                // Ví dụ: hiển thị giá trị trên màn hình
                // progressTextView.text = "Progress: $progress%"
//                tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_top_radius_click","User tác động vào Top radius bar","radius_click")

                binding.mTxtTop.text = progress.toString()
                val imageBorderView = binding.includeBorderWidth.mLlBoderWidth.findViewById(R.id.mImageBorder) as ImageBorderView2
                imageBorderView.changeDurationTop((progress * 4).toFloat(),(progress * 4).toFloat())
                durationTop = (progress * 4).toFloat()
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng bắt đầu vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng kết thúc vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }
        })

        binding.mProgressBarBottom.setOnSeekBarChangeListener(object :
            SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
//                tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_bottom_radius_click","User tác động vào Bottom radius bar","radius_click")

                // Khi giá trị tiến trình thay đổi (khi vuốt)
                // Bạn có thể làm gì đó với giá trị progress ở đây
                // Ví dụ: hiển thị giá trị trên màn hình
                // progressTextView.text = "Progress: $progress%"
                binding.mTxtBottom.text = progress.toString()
                val imageBorderView = binding.includeBorderWidth.mLlBoderWidth.findViewById(R.id.mImageBorder) as ImageBorderView2
                imageBorderView.changeDurationBottom((progress * 4).toFloat(),(progress * 4).toFloat())
                durationBottom = (progress * 4).toFloat()
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng bắt đầu vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng kết thúc vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }
        })

        binding.mWidth.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
//                tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_width_click","User tác động vào Width bar","width_click")

                // Khi giá trị tiến trình thay đổi (khi vuốt)
                // Bạn có thể làm gì đó với giá trị progress ở đây
                // Ví dụ: hiển thị giá trị trên màn hình
                // progressTextView.text = "Progress: $progress%"
                binding.mTxtWidth.text = progress.toString()
                try {
                    val imageBorderView = binding.includeBorderWidth.mLlBoderWidth.findViewById(R.id.mImageBorder) as ImageBorderView2
                    imageBorderView.changeScaleFactor(progress)
                    withSend = progress
                }catch (ex: Exception){
                    Log.d("qqq", "onItemClick: "+ex.message.toString())
                }
//                coloredBorderView.setColorAnimatorDuration(duration.toLong())
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng bắt đầu vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng kết thúc vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }
        })

        binding.mSpeed.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
//                tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_speed_click","User tác động vào Speed bar","speed_click")

                // Khi giá trị tiến trình thay đổi (khi vuốt)
                // Bạn có thể làm gì đó với giá trị progress ở đây
                // Ví dụ: hiển thị giá trị trên màn hình
                // progressTextView.text = "Progress: $progress%"
                binding.mTxtSpeed.text = progress.toString()
                try {
                    val imageBorderView = binding.includeBorderWidth.mLlBoderWidth.findViewById(R.id.mImageBorder) as ImageBorderView2
                    imageBorderView.changeDuration(progress * 11)
                    duration =  progress * 11
                }catch (ex: Exception){
                    Log.d("qqq", "onItemClick: "+ex.message.toString())
                }
//                coloredBorderView.setColorAnimatorDuration(duration.toLong())
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng bắt đầu vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
                // Khi người dùng kết thúc vuốt ProgressBar
                // Bạn có thể xử lý ở đây nếu cần
            }
        })
    }

    fun initImageBorderStyle(){
        val list: ArrayList<Int> = ArrayList()
        list.add(R.drawable.ic_ess)
        list.add(R.drawable.ic_fire)
        list.add(R.drawable.icon_record)
        list.add(R.drawable.icon_stop)
        list.add(R.drawable.ic_play)
        list.add(R.drawable.icon_record)
        list.add(R.drawable.icon_stop)
        list.add(R.drawable.ic_play)
//        list.add(R.drawable.ic_ess)
//        list.add(R.drawable.ic_fire)
//        list.add(R.drawable.icon_record)
//        list.add(R.drawable.icon_stop)
//        list.add(R.drawable.ic_play)
//        list.add(R.drawable.icon_record)
//        list.add(R.drawable.icon_stop)
//        list.add(R.drawable.ic_play)
//        list.add(R.drawable.ic_ess)
//        list.add(R.drawable.ic_fire)
//        list.add(R.drawable.icon_record)
//        list.add(R.drawable.icon_stop)
//        list.add(R.drawable.ic_play)
//        list.add(R.drawable.icon_record)
//        list.add(R.drawable.icon_stop)
//        list.add(R.drawable.ic_play)



        val numberOfColumns = 8
        val layoutManager = GridLayoutManager(this, numberOfColumns)
        binding.mRcyclerStyle.layoutManager =
            layoutManager
        imageBorderAdapter = ImageBoderAdapter(
            this,
            list,
            object : ImageBoderAdapter.OnItemClickListener {
                override fun onItemClick(position: Int) {
                    try {
//                        tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_border_style_click","User chọn loại border","style_click")

                        val imageBorderView = binding.includeBorderWidth.mLlBoderWidth.findViewById(R.id.mImageBorder) as ImageBorderView2
                        imageBorderView.createBitmapByShape(list[position])
                        shapePosition = list[position]
                    }catch (ex: Exception){
                        Log.d("qqq", "onItemClick: "+ex.message.toString())
                    }
                    imageBorderAdapter?.notifyDataSetChanged()
                }
            })
        binding.mRcyclerStyle.adapter = imageBorderAdapter
    }

    fun initColorBorder(){
        val list: ArrayList<ColorEdgeModel> = ArrayList()
        list.add(ColorEdgeModel(R.drawable.ic_rectangle_red,"#EE2929"))
        list.add(ColorEdgeModel(R.drawable.ic_rectangle_yel,"#EAB93D"))
        list.add(ColorEdgeModel(R.drawable.ic_rectangle_blue,"#19E73A"))
        list.add(ColorEdgeModel(R.drawable.ic_rectangle_blues,"#1188DD"))
        list.add(ColorEdgeModel(R.drawable.ic_rectangle_t,"#CE1EEB"))

        binding.mRecyclerColor.layoutManager =
            LinearLayoutManager(this@EdgeLightingActivity, RecyclerView.HORIZONTAL, false)

        colorBorderAdapter = ColorBorderAdapter(
            this,
            list,
            object : ColorBorderAdapter.OnItemClickListener {
                override fun onItemClick(position: Int) {
                    try {
//                        tracKingFirebaseAnalytics(mFirebaseAnalytics,"setting_edge_lighting_lighting_color_click","Chọn màu cho border",list[position].color.toString())

                        val imageBorderView = binding.includeBorderWidth.mLlBoderWidth.findViewById(R.id.mImageBorder) as ImageBorderView2
                        imageBorderView.changeColor(Color.parseColor(list[position].color))
                        colorString = list[position].color
//                        launchMainService(true)
                    }catch (ex: Exception){
                        Log.d("qqq", "onItemClick: "+ex.message.toString())
                    }
                    colorBorderAdapter?.notifyDataSetChanged()
                    sharedPreferencesUtil.saveInt("positionList", position)
                }
            })
        binding.mRecyclerColor.adapter = colorBorderAdapter
    }

    @RequiresApi(Build.VERSION_CODES.M)
    override fun onDestroy() {
        super.onDestroy()
        checkStopAndStartWidget()
//        bannerAdHelper?.unregisterAdListener(adCallback)
    }

    @RequiresApi(Build.VERSION_CODES.M)
    override fun onPause() {
        super.onPause()
        Utils.hideAdsResume()
        checkStopAndStartWidget()
    }

    @SuppressLint("NewApi")
    override fun onResume() {
        super.onResume()
        launchMainService(false)
        AppUtils.hideNavigationBar(this)
    }

    @SuppressLint("NewApi")
    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) {
            AppUtils.hideNavigationBar(this)
        }
    }
    @RequiresApi(Build.VERSION_CODES.M)
    private fun launchMainService(isCheck: Boolean = true) {
        if (Settings.canDrawOverlays(this)){
            val svc = Intent(this, MainService::class.java)
            stopService(svc)
            if (isCheck){
                svc.putExtra("changeDurationTop",durationTop)
                svc.putExtra("changeDurationBottom",durationBottom)
                svc.putExtra("changeWith",withSend)
                svc.putExtra("changeDuration",duration)
                svc.putExtra("createBitmapByShape",shapePosition)
                svc.putExtra("changeColor",colorString)
                startService(svc)
            }
        }
//        finish()
    }

    @SuppressLint("NewApi")
    fun checkStopAndStartWidget(){
        if(sharedPreferencesUtil.getStatusWidgetEdge("isCheckPermissionwidget") && sharedPreferencesUtil.getIsOverLay("isOverLay")){
            launchMainService(true)
        }else{
            launchMainService(false)
        }
    }

    @RequiresApi(Build.VERSION_CODES.M)
    private fun checkDrawOverlayPermission() {
        // Checks if app already has permission to draw overlays
        if (!Settings.canDrawOverlays(this)) {
//            AppOpenManager.getInstance()
//                .disableAdResumeByClickAction()
            // If not, form up an Intent to launch the permission request
            val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName"))
            // Launch Intent, with the supplied request code
            startActivityForResult(intent, REQUEST_CODE)
        }
    }

    @RequiresApi(Build.VERSION_CODES.M)
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // Check if a request code is received that matches that which we provided for the overlay draw request
        if (requestCode == REQUEST_CODE) {
            if (!Settings.canDrawOverlays(this)){
                sharedPreferencesUtil.saveStatusWidgetEdge("isCheckPermissionwidget",false)
                binding.mCheck.isChecked = sharedPreferencesUtil.getStatusWidgetEdge("isCheckPermissionwidget")
            }else{
                sharedPreferencesUtil.saveStatusWidgetEdge("isCheckPermissionwidget",true)
                binding.mCheck.isChecked = sharedPreferencesUtil.getStatusWidgetEdge("isCheckPermissionwidget")
            }
        }
    }

    private fun loadBanner() {
//        if (!FirebaseRemoteConfig.getInstance()
//                .getBoolean(Constants.Banner) && !AppUtils.haveNetworkConnection(this)) {
//
//        } else {
//            tracKingFirebaseAnalytics(mFirebaseAnalytics,"Banner_view","view tại các màn hình: Edge","banner_view")
//            bannerAdHelper = initBannerAd()
//            bannerAdHelper?.setBannerContentView(binding.mLlBanner)
//            bannerAdHelper?.registerAdListener(adCallback)
//            if (bannerAdHelper?.bannerAdView != null) {
//                bannerAdHelper?.requestAds(BannerAdParam.Ready(bannerAdHelper?.bannerAdView!!))
//            }else{
//                bannerAdHelper?.requestAds(BannerAdParam.Request.create())
//            }
//            binding.mLlBanner.setVisibility(View.VISIBLE)
//        }
    }

//    private fun initBannerAd(): BannerAdHelper {
//        val config = BannerAdConfig(
//            BuildConfig.Banner,
//            FirebaseRemoteConfig.getInstance()
//                .getBoolean(Constants.Banner),
//            FirebaseRemoteConfig.getInstance()
//                .getBoolean(Constants.allow_reload_banner),
//            // with native additional layout native ad
//        )
//        return BannerAdHelper(this,  this, config)
//    }
}