package org.fnives.flutter.experiment_shorebird

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Intent
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel


class MainActivity : FlutterActivity() {
    private val channel = "MainChannel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(
            flutterEngine.dartExecutor.binaryMessenger,
            channel
        ).setMethodCallHandler { call, result ->
            when (call.method) {
                Methods.RESTART.methodName -> {
                    try {
                        if (this.intent.categories.contains(Intent.CATEGORY_HOME)) {
                            if (isDefaultHomeApp()) {
                                runViaAlarmManager(getHomeIntent())
                            } else {
                                runViaAlarmManager(Intent.makeRestartActivityTask(componentName))
                            }
                        } else {
                            runDirectly(Intent.makeRestartActivityTask(componentName))
                        }
                        finishAndRemoveTask()
                        Runtime.getRuntime().exit(0)
                        result.success(null)
                    } catch (e: Throwable) {
                        result.error("couldn't start activity", e.message ?: "", null)
                    }
                }
            }
        }
    }

    private fun getHomeIntent() =
        Intent(intent.action).apply {
            flags = Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
            intent.setComponent(component)
            intent.categories.forEach {
                addCategory(it)
            }
        }

    private fun runDirectly(intent: Intent) {
        context.startActivity(intent)
    }

    private fun runViaAlarmManager(intent: Intent) {
        val pendingIntent = PendingIntent.getActivity(
            context,
            4201,
            intent,
            PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager
        alarmManager[AlarmManager.RTC, System.currentTimeMillis()+100] = pendingIntent
    }

    private fun isDefaultHomeApp(): Boolean {
        val intent = Intent(Intent.ACTION_MAIN)
        intent.addCategory(Intent.CATEGORY_HOME)
        val res = packageManager.resolveActivity(intent, 0)
        val isHomeApp = res?.activityInfo != null && (packageName == res.activityInfo.packageName)
        return isHomeApp
    }
}
