package com.app.input.personalised.board.boartactivity

import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.OnApplyWindowInsetsListener
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.ad.tradpluslibrary.TPAdManager
import com.app.input.personalised.board.BoartApp
import com.app.input.personalised.board.R
import com.app.input.personalised.board.databean.KeyboardTheme
import com.app.input.personalised.board.itemback.ItemClickListener
import com.app.input.personalised.board.itemback.ThemeApplyListener
import com.app.input.personalised.board.basedata.ThemeRepository
import com.app.input.personalised.board.listhelpers.RelatedThemeAdapter
import com.app.input.personalised.board.boartfragment.EnableKeyboardDialog
import com.app.input.personalised.board.helpers.AppUtils
import com.app.input.personalised.board.helpers.ThemeDownloader
import com.app.input.personalised.board.helpers.ThemePreferences
import com.bumptech.glide.Glide
import com.bumptech.glide.integration.webp.decoder.WebpDrawable
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import kotlinx.coroutines.launch
import java.io.File


class ThemeDetailActivity : AppCompatActivity() {
    companion object {
        @JvmField
        var DISPLAY_URL_KEY: String = "display_url_key"

        @JvmField
        val ZIP_URL_KEY = "zip_url_key"


        @JvmField
        val NAME_KEY = "name_key"

        @JvmField
        val GIF_KEY = "gif_key"

        @JvmField
        val THUMB_KEY = "thumb_key"

        @JvmField
        val SOURCE_KEY = "data_key"
    }

    private var dialog: EnableKeyboardDialog? = null
    private lateinit var displayUrl: String
    private lateinit var gifUrl: String
    private lateinit var zipUrl: String
    private lateinit var name: String
    private lateinit var applyBtn: LinearLayout
    private lateinit var imgData: ImageView
    private lateinit var imgBack: ImageView
    private lateinit var textName: TextView

    private lateinit var recommendedRecycler: RecyclerView
//    private lateinit var viewAllLayout: LinearLayout

    private lateinit var loadingLayout: FrameLayout

    private lateinit var unzipPath: String

    private lateinit var tvDownload: TextView
    private lateinit var imDownload: ImageView

    private lateinit var thumb: String

    private lateinit var imgLike: ImageView

    private lateinit var data: KeyboardTheme

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_theme_detail)
        TPAdManager.loadAllAd(this)
        com.app.input.personalised.board.helpers.StatusBarHelper.setTransparentStatusBar(this)
        ViewCompat.setOnApplyWindowInsetsListener(
            findViewById<View?>(R.id.main),
            OnApplyWindowInsetsListener { v: View?, insets: WindowInsetsCompat? ->
                val systemBars = insets!!.getInsets(WindowInsetsCompat.Type.systemBars())
                v!!.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
                insets
            })

        // 延迟设置状态栏，确保覆盖MaterialComponents主题可能的自动设置
        findViewById<View>(R.id.main).post {
            com.app.input.personalised.board.helpers.StatusBarHelper.setTransparentStatusBar(this)
        }

        findViewId()
        getExtraData()
        displayData()
        setApply()
        onClick()

        TPAdManager.showTPAD(this) {}
    }

    override fun onResume() {
        super.onResume()
        // 确保状态栏始终为透明
        com.app.input.personalised.board.helpers.StatusBarHelper.setTransparentStatusBar(this)
    }

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) {
            // 窗口获得焦点时，确保状态栏为透明
            com.app.input.personalised.board.helpers.StatusBarHelper.setTransparentStatusBar(this)
        }
    }

    private fun getExtraData() {
        data = intent.getSerializableExtra(SOURCE_KEY) as KeyboardTheme

        displayUrl = intent.getStringExtra(DISPLAY_URL_KEY).toString()
        zipUrl = intent.getStringExtra(ZIP_URL_KEY).toString()
        name = intent.getStringExtra(NAME_KEY).toString()
        gifUrl = intent.getStringExtra(GIF_KEY).toString()
        thumb = intent.getStringExtra(THUMB_KEY).toString()

        val serviceZipName = ThemeDownloader.getServiceZipName(zipUrl)
        unzipPath = ThemeDownloader.getUnzipPath(serviceZipName)

        Log.d("-------------------", "-------unzipPath=" + unzipPath)
        lifecycleScope.launch {
            ThemeRepository.getIsLike(name) {
                imgLike.isSelected = it
            }
        }

        if (File(unzipPath).exists()) {
            imDownload.isVisible = false
            tvDownload.text = getString(R.string.apply)
        } else {
            imDownload.isVisible = true
            tvDownload.text = getString(R.string.download_apply)
        }

    }

    private fun findViewId() {
        applyBtn = findViewById(R.id.layoutDownloadApply)
        imgData = findViewById(R.id.image_data)
        imgBack = findViewById(R.id.back)
        textName = findViewById(R.id.textview_data_name)
        recommendedRecycler = findViewById(R.id.recommended_recycler)
//        viewAllLayout = findViewById(R.id.layout_view_all)

        imgLike = findViewById(R.id.im_like)
        loadingLayout = findViewById(R.id.loading)
        imDownload = findViewById(R.id.im_download)
        tvDownload = findViewById(R.id.tv_download)
    }

    private fun displayData() {
        textName.text = name
        if (gifUrl.isNotEmpty()) {
            loadImgGif()
        } else {
            Glide.with(this)
                .load(displayUrl)
                .thumbnail(Glide.with(this).load(thumb))
                .into(imgData)
        }
    }


    private fun onClick() {
        imgBack.setOnClickListener {
            finish()
        }

        imgLike.setOnClickListener {
            imgLike.isSelected = !imgLike.isSelected

            lifecycleScope.launch {
                if (imgLike.isSelected) {
                    ThemeRepository.addLike(data)
                } else {
                    ThemeRepository.removeLike(data)
                }
            }
        }
        val forYouList = BoartApp.Companion.list.filter {
            it.parentName == getString(R.string.recommend_name)

        }

        recommendedRecycler.run {
            adapter =  RelatedThemeAdapter(
                this@ThemeDetailActivity
            ).apply {
                val shuffled = forYouList[0].keyboardList.shuffled()
                setForYouList(shuffled)
            }.apply {
                setClickAction(object : ItemClickListener {
                    override fun OnItemClickListener() {
                        finish()
                    }

                })
            }

            layoutManager = GridLayoutManager(this@ThemeDetailActivity, 2)

        }

    }

    @SuppressLint("CheckResult")
    private fun loadImgGif() {
        Glide.with(this)
            .load(gifUrl)
            .thumbnail(Glide.with(this).load(thumb))
            .addListener(object : RequestListener<Drawable> {
                override fun onLoadFailed(
                    e: GlideException?,
                    model: Any?,
                    target: Target<Drawable>,
                    isFirstResource: Boolean
                ): Boolean {

                    return false
                }

                override fun onResourceReady(
                    resource: Drawable,
                    model: Any,
                    target: Target<Drawable>?,
                    dataSource: DataSource,
                    isFirstResource: Boolean
                ): Boolean {
                    if (resource is WebpDrawable) {
                        resource.loopCount = WebpDrawable.LOOP_FOREVER
                    }

                    return false
                }

            }).into(imgData)
    }

    private fun setApply() {
        applyBtn.setOnClickListener {
            val checkEnable = AppUtils.checkEnable(this)
            val checkSetDefault = AppUtils.checkSetDefault(this)
            if (!checkEnable || !checkSetDefault) {
                showDialog()
                return@setOnClickListener
            }
            startDown()

        }
    }

    private fun showDialog() {
        dialog = dialog ?: EnableKeyboardDialog.newInstance() .apply{


        }
        dialog?.setClickListener {
            startDown()
        }
        dialog?.show(supportFragmentManager, "")
    }

    private fun startDown() {
        loadingLayout.isVisible = true
        applyBtn.isEnabled = false

        val file = File(unzipPath)
        if (file.exists()) {
            val findFirstDirectory = ThemeDownloader.findFirstDirectory(file)

            apply("${findFirstDirectory}/")
            applyBtn.isEnabled = true
            loadingLayout.isVisible = false
        } else {
            ThemeDownloader.startDownloadZip(zipUrl, object :
                ThemeApplyListener {
                override fun OnApplySkinListener(fileList: List<File?>?) {
                    runOnUiThread {
                        applyBtn.isEnabled = true
                        loadingLayout.isVisible = false
                    }
                    if (fileList.isNullOrEmpty()) {
                        runOnUiThread {
                            Toast.makeText(
                                this@ThemeDetailActivity,
                                getString(R.string.download_fail),
                                Toast.LENGTH_SHORT
                            ).show()
                        }
                    } else {
//                        lifecycleScope.launch {
//                            DbFunction.addDownload(data)
//                        }
                        if (file.exists()) {
                            val findFirstDirectory = ThemeDownloader.findFirstDirectory(file)
                            Log.d(
                                BoartApp.Companion.TAG,
                                "----apply------------it=$findFirstDirectory"
                            )
                            runOnUiThread {
                                apply("${findFirstDirectory}/")

                            }
                        }
                    }


                }

            })
        }

    }

    private fun apply(path: String) {
        var skinParentPath = path
        if (path.contains("res")) {
            skinParentPath = path.substringBeforeLast("res")
        }


        ThemePreferences.updateSkinPath(skinParentPath)
        Toast.makeText(
            this@ThemeDetailActivity,
            getString(R.string.theme_application_successful),
            Toast.LENGTH_SHORT
        ).show()
        startActivity(Intent(this, ThemePreviewActivity::class.java).apply {
            putExtra(ThemePreviewActivity.key_name, name)
        })
        finish()
    }




}