package rallyedto.farewelledto

import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.databinding.ArenaedtoBinding
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import rallyedto.sunedto.tumouredto.majorityedto.loseedto.Togetheredto

class Lazyedto(
    val activity: AppCompatActivity,
) {
    private val TAG = "FileScanDialog"
    private val a1 = ValueAnimator.ofFloat(0f, -360f)
    private val dialog = AlertDialog.Builder(activity).create()
    private val binding = ArenaedtoBinding.inflate(LayoutInflater.from(activity))

    @SuppressLint("SetTextI18n")
    fun showFileScanDialog(
        pathFlow: SharedFlow<String>,
        foundFlow: SharedFlow<Pair<Int, String>>,
        foundAction: ((path: String) -> Unit)? = null
    ): AlertDialog {
        dialog?.setView(binding.root)
        dialog?.setCanceledOnTouchOutside(false)
        dialog?.setCancelable(false)
        dialog?.show()

        dialog?.window?.setBackgroundDrawableResource(android.R.color.transparent)
        val params = dialog?.window?.attributes
        params?.width = activity.resources.getDimensionPixelOffset(R.dimen.initialedto)
        dialog?.window?.attributes = params

        a1.run {
            duration = 1000
            repeatMode = ValueAnimator.RESTART
            repeatCount = ValueAnimator.INFINITE
            interpolator = LinearInterpolator()
            addUpdateListener {
                binding.usefuledto.rotation = it.animatedValue as Float
            }
            start()
        }

        dialog?.setOnDismissListener {
            a1.cancel()
        }

        Togetheredto.showNativeAd(activity, binding.disappointedto, isShowAdNative = Togetheredto.isShowNads())

        var pathShowed = false
        activity.lifecycleScope.launch(Dispatchers.Main) {
            pathFlow.collectLatest { path ->
                if (!pathShowed) {
                    pathShowed = true
                    binding.busedto.visibility = View.VISIBLE
                }
                binding.busedto.text = path
            }
        }
        activity.lifecycleScope.launch {
            foundFlow.collectLatest {
                binding.insureedto.text = "Found ${it.first} files"
                foundAction?.invoke(it.second)
            }
        }

        return dialog
    }

    @SuppressLint("SetTextI18n")
    fun finishScan(clickAction: () -> Unit) {
        a1.cancel()
        binding.franchiseedto.visibility = View.VISIBLE
        binding.usefuledto.visibility = View.GONE
        binding.busedto.visibility = View.GONE
        binding.momentedto.text = "Scan Completed"
        binding.franchiseedto.setOnClickListener {
            clickAction.invoke()
        }
    }
}