package com.base.datarecovery.view

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.ads.AdmobMaxHelper
import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.databinding.DialogFileScanBinding
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch

class FileScanDialog(
    val activity: AppCompatActivity,
) {
    private val TAG = "FileScanDialog"
    private val a1 = ValueAnimator.ofFloat(0f, -360f)
    private val dialog = AlertDialog.Builder(activity).create()
    private val binding = DialogFileScanBinding.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.dp_300)
        dialog?.window?.attributes = params

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

        dialog?.setOnDismissListener {
            a1.cancel()
        }

        AdmobMaxHelper.admobMaxShowNativeAd(activity, binding.flAd)

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

        return dialog
    }

    @SuppressLint("SetTextI18n")
    fun finishScan(clickAction: () -> Unit) {
        a1.cancel()
        binding.tvBtn.visibility = View.VISIBLE
        binding.iv.visibility = View.GONE
        binding.tvPath.visibility = View.GONE
        binding.tvTitle.text = "Scan Completed"
        binding.tvBtn.setOnClickListener {
            clickAction.invoke()
        }
    }
}