import android.app.AlertDialog
import android.os.Bundle
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.activity.viewModels
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber

class MainActivity : AppCompatActivity() {

    private val viewModel: MainViewModel by viewModels() 
    private val TAG = "MainActivity"

    private val backCallback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            handleAppExit()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        onBackPressedDispatcher.addCallback(this, backCallback)
    }

    private fun handleAppExit() {
        backCallback.isEnabled = false 

        lifecycleScope.launch(Dispatchers.IO) {
            try {
		//判断是否需要提示
                val isBeConfirm = true

                if (isBeConfirm) {
                    withContext(Dispatchers.Main) {
                        showExitConfirmationDialog()
                    }
                } else {
                    withContext(Dispatchers.Main) {
                        finish()
                    }
                }
            } catch (e: Exception) {
                Timber.tag(TAG).e(e)
                if (e !is CancellationException) {
                    withContext(Dispatchers.Main) {
                        finish()
                    }
                }
            } finally {
                withContext(Dispatchers.Main) {
                    backCallback.isEnabled = true
                }
            }
        }
    }

    private fun showExitConfirmationDialog() {
        AlertDialog.Builder(this)
            .setTitle("还不能退出")
            .setMessage("退出后,会如何?")
            .setPositiveButton("继续退出") { dialog, which ->
                finish()
            }
            .setNegativeButton("取消") { dialog, which ->
                dialog.dismiss()
            }
            .setCancelable(false)
            .show()
    }
}