package rallyedto.farewelledto

import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.text.SpannableString
import android.text.Spanned
import android.text.style.ForegroundColorSpan
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.LifecycleCoroutineScope
import com.base.datarecovery.R
import com.base.datarecovery.databinding.ArrangementedtoBinding
import com.base.datarecovery.databinding.BelledtoBinding
import com.base.datarecovery.databinding.ImmuneedtoBinding
import com.base.datarecovery.databinding.IndirectedtoBinding
import com.base.datarecovery.databinding.MotorcycleedtoBinding
import com.base.datarecovery.databinding.PineedtoBinding
import com.base.datarecovery.databinding.RememberedtoBinding
import com.base.datarecovery.databinding.StainedtoBinding
import com.base.datarecovery.databinding.ThawedtoBinding
import com.base.datarecovery.databinding.WhatedtoBinding
import com.base.datarecovery.databinding.WoundedtoBinding
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import rallyedto.finishedto.hypothesisedto.vegetableedto.breakfastedto.Practicaledto
import rallyedto.policeedto.huntedto.Snuggleedto.SELECT_FILE_ALL
import rallyedto.policeedto.huntedto.Snuggleedto.SELECT_FILE_AUDIO
import rallyedto.policeedto.huntedto.Snuggleedto.SELECT_FILE_DOCUMENT
import rallyedto.policeedto.huntedto.Snuggleedto.SELECT_FILE_OTHER
import rallyedto.policeedto.huntedto.Snuggleedto.SELECT_FILE_PICTURE
import rallyedto.policeedto.huntedto.Snuggleedto.SELECT_FILE_VIDEO
import rallyedto.sunedto.tumouredto.majorityedto.loseedto.Togetheredto
import rallyedto.talledto.blewedto.Musicaledto
import java.io.File
import kotlin.random.Random

object Technologyedto {

    private val TAG = "DialogViews"

    @SuppressLint("SetTextI18n")
    fun Context.showGerPermission(
        tittle: String? = null,
        desc: String? = null,
        denyText: String? = null,
        allowText: String? = null,
        deny: ((view: Dialog) -> Unit)? = null,
        allow: ((view: Dialog) -> Unit)? = null
    ): Dialog {
        val dialog = Dialog(this)
        val binding = RememberedtoBinding.inflate(LayoutInflater.from(this))
        dialog.requestWindowFeature(1)
        dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        dialog.window!!.setLayout(-1, -1)
        dialog.setCanceledOnTouchOutside(false)
        dialog.setCancelable(false)
        dialog.setContentView(binding.root)
        val str = resources.getString(R.string.paralleledto)

        tittle?.let { binding.momentedto.text = it }
        desc?.let { binding.faintedto.text = it }
        denyText?.let { binding.babyedto.text = it }
        allowText?.let { binding.steadyedto.text = it }

        binding.reductionedto.imageAssetsFolder = "recovery_permission_finger/images/"
        binding.reductionedto.setAnimation("recovery_permission_finger/data.json")
        binding.reductionedto.playAnimation()
        binding.babyedto.setOnClickListener {
            dialog.dismiss()
            deny?.invoke(dialog)
        }
        binding.steadyedto.setOnClickListener {
            dialog.dismiss()
            allow?.invoke(dialog)
        }
        dialog.show()
        return dialog
    }


    @SuppressLint("SetTextI18n")
    fun Context.showRecoveringDialog(
        lifecycleScope: LifecycleCoroutineScope,
        list: List<String>,
        dir: File,
        copyProgressAction: () -> Unit,
        finish: () -> Unit
    ) {
        val dialog = BottomSheetDialog(this)
        val binding = ImmuneedtoBinding.inflate(LayoutInflater.from(this))
        dialog.setContentView(binding.root)
        dialog.setCanceledOnTouchOutside(false)

        val mutableSharedFlow = MutableSharedFlow<Int>(
            replay = 5,//当新的订阅者Collect时，发送几个已经发送过的数据给它
            extraBufferCapacity = 5,//减去replay，MutableSharedFlow还缓存多少数据,缓冲池容量 = replay + extraBufferCapacity
            onBufferOverflow = BufferOverflow.SUSPEND//缓存策略，三种 丢掉最新值、丢掉最旧值和挂起
        )
        val sharedFlow: SharedFlow<Int> = mutableSharedFlow

        val parentView = binding.root.parent as View
        val behavior = BottomSheetBehavior.from(parentView)
        //展开
        behavior.state = BottomSheetBehavior.STATE_EXPANDED
        // 设置禁止通过拖动来隐藏
        behavior.isHideable = false

        // 禁止点击外部区域关闭
        dialog.setOnCancelListener { dialogInterface ->
            dialogInterface.cancel() // 这里可以处理点击外部区域的逻辑
        }

        lifecycleScope.launch(Dispatchers.IO) {

            val arrayList = arrayListOf<String>().apply {
                addAll(list)
            }
            var index = 0
            while (arrayList.isNotEmpty()) {
                val path = arrayList[0]
                arrayList.removeAt(0)
                val file = File(path)
                runCatching {
                    val recoveryFile = File(dir, file.name)
                    file.copyTo(recoveryFile, true)
                }
                mutableSharedFlow.emit(index)
                delay(Random.nextLong(500, 1500))
                index++
            }
            mutableSharedFlow.emit(-1)
        }

        lifecycleScope.launch(Dispatchers.Main) {
            sharedFlow.collectLatest {
                Musicaledto.logDebug(TAG, "Flow $it")
                if (it == -1) {
                    finish.invoke()
                    dialog.dismiss()
                    cancel()
                } else {
                    val process = it.toFloat() / list.size.toFloat()
                    if (process > 0.3) {
                        copyProgressAction.invoke()
                    }
                    binding.grabbededto.text = "${it + 1}/${list.size}"
                }
            }
        }

        dialog.show()
    }


    fun Context.showImageImportDialog(import: () -> Unit, camera: () -> Unit) {
        val binding = MotorcycleedtoBinding.inflate(LayoutInflater.from(this))
        val dialog =
            AlertDialog.Builder(this, R.style.anticipationedto).setView(binding.root).create()

        dialog.setContentView(binding.root)
        dialog.setCanceledOnTouchOutside(true)
        dialog.show()

        val params = dialog.window?.attributes
        params?.gravity = Gravity.BOTTOM
        params?.y = 50

        dialog.window?.attributes = params

        binding.centraledto.setOnClickListener {
            dialog.dismiss()
            import.invoke()
        }
        binding.wormedto.setOnClickListener {
            dialog.dismiss()
            camera.invoke()
        }
    }

    fun Context.showCameraSettingDialog() {
        val binding = PineedtoBinding.inflate(LayoutInflater.from(this))
        val dialog =
            AlertDialog.Builder(this, R.style.anticipationedto).setView(binding.root).create()

        dialog.setContentView(binding.root)
        dialog.setCanceledOnTouchOutside(true)
        dialog.show()

        val params = dialog.window?.attributes

        dialog.window?.attributes = params
        binding.ostracizeedto.setOnClickListener { dialog.dismiss() }
    }

    fun Context.showRemoveOriginalTip(click: (isRememberOption: Boolean, isRemove: Boolean) -> Unit) {
        val binding = WhatedtoBinding.inflate(LayoutInflater.from(this))
        val dialog = AlertDialog.Builder(this, R.style.anticipationedto).create()

        dialog.setView(binding.root)
        dialog.setContentView(binding.root)
        dialog.setCanceledOnTouchOutside(false)
        dialog.show()

        val params = dialog.window?.attributes
        params?.width = resources.getDimensionPixelOffset(R.dimen.initialedto)
        dialog.window?.attributes = params

        binding.auntedto.setOnClickListener {
            binding.auntedto.isSelected = !binding.auntedto.isSelected
        }

        binding.concertedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(binding.auntedto.isSelected, true)
        }
        binding.counteredto.setOnClickListener {
            dialog.dismiss()
            click.invoke(binding.auntedto.isSelected, false)
        }
    }

    fun Context.showPinReEnterDialog(): Woreedto {
        val dialog = Woreedto(this, R.layout.identityedto)
        dialog.window?.setDimAmount(0f)
        dialog.show()
        return dialog
    }

    fun Context.showDeletePermanentlyDialog(deleteAction: () -> Unit) {
        val binding = ThawedtoBinding.inflate(LayoutInflater.from(this))
        val dialog = AlertDialog.Builder(this, R.style.anticipationedto).create()
        dialog.setView(binding.root)
        dialog.show()


        val params = dialog.window?.attributes
        params?.width = resources.getDimensionPixelOffset(R.dimen.initialedto)
        dialog.window?.attributes = params

        binding.censorshipedto.setOnClickListener {
            dialog.cancel()
            deleteAction.invoke()
        }
        binding.crystaledto.setOnClickListener {
            dialog.cancel()
        }
    }

    fun Context.showExitFunctionDialog(
        exitAction: (showAd: Boolean) -> Unit
    ) {
        val binding = ArrangementedtoBinding.inflate(LayoutInflater.from(this))
        val dialog = AlertDialog.Builder(this).create()
        dialog.setView(binding.root)
        dialog.setCanceledOnTouchOutside(false)
        dialog.show()

        dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
        val params = dialog.window?.attributes
        params?.width = resources.getDimensionPixelOffset(R.dimen.paragraphedto)
        dialog.window?.attributes = params
        Togetheredto.showNativeAd(this as Activity,binding.jeweledto, isShowAdNative = Togetheredto.isShowNads())
        binding.needleedto.setOnClickListener {
            dialog.dismiss()
            exitAction.invoke(true)
        }
        binding.meaningedto.setOnClickListener {
            dialog.dismiss()
        }
    }

    fun Activity.showExitDialog() {
        val binding = WoundedtoBinding.inflate(LayoutInflater.from(this))
        val dialog = AlertDialog.Builder(this).create()
        dialog.setView(binding.root)
//        dialog.setCanceledOnTouchOutside(false)
//        dialog.setCancelable(false)
        dialog.show()


        dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
        val lp: WindowManager.LayoutParams? = dialog.window?.attributes
        lp?.gravity = Gravity.BOTTOM
        lp?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
//        lp?.alpha = 1f
//        lp?.dimAmount = 0.0f
        dialog.window?.setAttributes(lp)

        binding.meaningedto.setOnClickListener {
            dialog.dismiss()
            startActivity(Intent(this, Practicaledto::class.java))
        }


        binding.microphoneedto.setOnClickListener {
            dialog.dismiss()
//            android.os.Process.killProcess(android.os.Process.myPid())
//            System.exit(0)
            this.finish()
        }
    }

    fun Context.showLargeFileTypeDialog(type: String, click: (type: String) -> Unit) {
        val binding = StainedtoBinding.inflate(LayoutInflater.from(this))
        val dialog = AlertDialog.Builder(this).create()
        dialog.setView(binding.root)
//        dialog.setCanceledOnTouchOutside(false)
//        dialog.setCancelable(false)
        dialog.show()

        dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
        val lp: WindowManager.LayoutParams? = dialog.window?.attributes
        lp?.gravity = Gravity.BOTTOM
        lp?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
        dialog.window?.setAttributes(lp)

        when (type) {
            SELECT_FILE_ALL -> binding.cartedto.isSelected = true
            SELECT_FILE_PICTURE -> binding.creationedto.isSelected = true
            SELECT_FILE_VIDEO -> binding.courseedto.isSelected = true
            SELECT_FILE_AUDIO -> binding.eternaledto.isSelected = true
            SELECT_FILE_DOCUMENT -> binding.gentleedto.isSelected = true
            SELECT_FILE_OTHER -> binding.witnessedto.isSelected = true
        }
        binding.cartedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_ALL)
        }
        binding.creationedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_PICTURE)
        }
        binding.courseedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_VIDEO)
        }
        binding.eternaledto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_AUDIO)
        }
        binding.gentleedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_DOCUMENT)
        }
        binding.witnessedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_OTHER)
        }
    }

    @SuppressLint("SetTextI18n")
    fun Context.showAppProcessExitDialog(percent: Int, action: () -> Unit) {
        val binding = IndirectedtoBinding.inflate(LayoutInflater.from(this))
        val dialog = AlertDialog.Builder(this).create()
        dialog.setView(binding.root)
        dialog.show()
        val text = "RAM accounts for more than $percent%.\nAre you sure want to leave?"
        val spannableString = SpannableString(text)

        val start = text.indexOf("$percent%")
        val end = start + "$percent%".length
        spannableString.setSpan(ForegroundColorSpan(Color.RED), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        binding.noonedto.text = spannableString
        dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
        val lp: WindowManager.LayoutParams? = dialog.window?.attributes

        lp?.width = this.resources.getDimensionPixelOffset(R.dimen.includeedto)
//        lp?.height=

        dialog.window?.setAttributes(lp)
        binding.needleedto.setOnClickListener {
            dialog.dismiss()
            action.invoke()
        }
        binding.meaningedto.setOnClickListener {
            dialog.dismiss()
        }
    }
    fun Context.showFeature() {
        val dialog = Dialog(this, R.style.groundsedto)
        val binding = BelledtoBinding.inflate(LayoutInflater.from(this))
        dialog.setContentView(binding.root)
        dialog.setCanceledOnTouchOutside(false)

        dialog.show()
        binding.utteredto.setOnClickListener {
            dialog.dismiss()
            //action.invoke()
        }
    }
}
