package importantedto.maidedto.witnessedto.nationalismedto

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.ArchitectedtoBinding
import com.base.datarecovery.databinding.ArchiveedtoBinding
import com.base.datarecovery.databinding.DevelopedtoBinding
import com.base.datarecovery.databinding.EventedtoBinding
import com.base.datarecovery.databinding.HitedtoBinding
import com.base.datarecovery.databinding.IdeaedtoBinding
import com.base.datarecovery.databinding.ImmuneedtoBinding
import com.base.datarecovery.databinding.IronyedtoBinding
import com.base.datarecovery.databinding.WidenedtoBinding
import com.base.datarecovery.databinding.ZeitgeistedtoBinding
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import importantedto.admireedto.sweptedto.Differenceedto
import importantedto.appliededto.surgeonedto.promiseedto.prospectedto.consumptionedto.blameedto.Reserveedto
import importantedto.concreteedto.cameedto.Hateedto.SELECT_FILE_ALL
import importantedto.concreteedto.cameedto.Hateedto.SELECT_FILE_AUDIO
import importantedto.concreteedto.cameedto.Hateedto.SELECT_FILE_DOCUMENT
import importantedto.concreteedto.cameedto.Hateedto.SELECT_FILE_OTHER
import importantedto.concreteedto.cameedto.Hateedto.SELECT_FILE_PICTURE
import importantedto.concreteedto.cameedto.Hateedto.SELECT_FILE_VIDEO
import importantedto.gallonedto.Tumbleedto
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 java.io.File
import kotlin.random.Random

object Photocopyedto {

    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 = ArchiveedtoBinding.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.kettleedto)

        tittle?.let { binding.assaultedto.text = it }
        desc?.let { binding.collegeedto.text = it }
        denyText?.let { binding.spideredto.text = it }
        allowText?.let { binding.aidedto.text = it }

        binding.domeedto.imageAssetsFolder = "recovery_permission_finger/images/"
        binding.domeedto.setAnimation("recovery_permission_finger/data.json")
        binding.domeedto.playAnimation()
        binding.spideredto.setOnClickListener {
            dialog.dismiss()
            deny?.invoke(dialog)
        }
        binding.aidedto.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 = ZeitgeistedtoBinding.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 {
                Tumbleedto.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.steepedto.text = "${it + 1}/${list.size}"
                }
            }
        }

        dialog.show()
    }


    fun Context.showImageImportDialog(import: () -> Unit, camera: () -> Unit) {
        val binding = IdeaedtoBinding.inflate(LayoutInflater.from(this))
        val dialog =
            AlertDialog.Builder(this, R.style.farewelledto).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.biologyedto.setOnClickListener {
            dialog.dismiss()
            import.invoke()
        }
        binding.deportedto.setOnClickListener {
            dialog.dismiss()
            camera.invoke()
        }
    }

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

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

        val params = dialog.window?.attributes

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

    fun Context.showRemoveOriginalTip(click: (isRememberOption: Boolean, isRemove: Boolean) -> Unit) {
        val binding = EventedtoBinding.inflate(LayoutInflater.from(this))
        val dialog = AlertDialog.Builder(this, R.style.farewelledto).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.weekedto)
        dialog.window?.attributes = params

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

        binding.enfixedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(binding.countedto.isSelected, true)
        }
        binding.terrifyedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(binding.countedto.isSelected, false)
        }
    }

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

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


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

        binding.tooledto.setOnClickListener {
            dialog.cancel()
            deleteAction.invoke()
        }
        binding.verbedto.setOnClickListener {
            dialog.cancel()
        }
    }

    fun Context.showExitFunctionDialog(
        mustShow: Boolean = false,
        exitAction: (showAd: Boolean) -> Unit
    ) {
        if (!mustShow) {
            if (!Differenceedto.showBackInterAdSp()) {
                exitAction.invoke(false)
                return
            }
        }

        val binding = DevelopedtoBinding.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.kneeedto)
        dialog.window?.attributes = params
        binding.satisfactionedto.setOnClickListener {
            dialog.dismiss()
            exitAction.invoke(true)
        }
        binding.wifeedto.setOnClickListener {
            dialog.dismiss()
        }
    }

    fun Activity.showExitDialog() {
        val binding = HitedtoBinding.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.wifeedto.setOnClickListener {
            dialog.dismiss()
            startActivity(Intent(this, Reserveedto::class.java))
        }


        binding.aboveedto.setOnClickListener {
            dialog.dismiss()
            this.finish()
        }
    }

    fun Context.showLargeFileTypeDialog(type: String, click: (type: String) -> Unit) {
        val binding = ArchitectedtoBinding.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.statementedto.isSelected = true
            SELECT_FILE_PICTURE -> binding.reviseedto.isSelected = true
            SELECT_FILE_VIDEO -> binding.gradualedto.isSelected = true
            SELECT_FILE_AUDIO -> binding.electedto.isSelected = true
            SELECT_FILE_DOCUMENT -> binding.fireplaceedto.isSelected = true
            SELECT_FILE_OTHER -> binding.projectedto.isSelected = true
        }
        binding.statementedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_ALL)
        }
        binding.reviseedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_PICTURE)
        }
        binding.gradualedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_VIDEO)
        }
        binding.electedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_AUDIO)
        }
        binding.fireplaceedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_DOCUMENT)
        }
        binding.projectedto.setOnClickListener {
            dialog.dismiss()
            click.invoke(SELECT_FILE_OTHER)
        }
    }

    @SuppressLint("SetTextI18n")
    fun Context.showAppProcessExitDialog(percent: Int, action: () -> Unit) {
        val binding = ImmuneedtoBinding.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.waistedto.text = spannableString
        dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
        val lp: WindowManager.LayoutParams? = dialog.window?.attributes

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

        dialog.window?.setAttributes(lp)
        binding.satisfactionedto.setOnClickListener {
            dialog.dismiss()
            action.invoke()
        }
        binding.wifeedto.setOnClickListener {
            dialog.dismiss()
        }
    }

}
