package com.jttools.datacontrol.service

import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.jttools.datacontrol.data.SettingsRepository
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.flow.first

/**
 * Filet de sécurité périodique (WorkManager) : relance [DataMonitorService] s'il a été tué par le
 * système alors que le contrôle est censé être actif. START_STICKY et le redémarrage au boot
 * (voir [BootReceiver]) ne suffisent pas toujours sur les ROM qui tuent agressivement les apps en
 * arrière-plan (ex: ColorOS) sans exemption d'optimisation batterie. Démarrer un service déjà en
 * cours d'exécution est sans effet, cet appel est donc sûr à répéter à chaque déclenchement.
 */
class DataMonitorRestartWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    @EntryPoint
    @InstallIn(SingletonComponent::class)
    interface RestartWorkerEntryPoint {
        fun settingsRepository(): SettingsRepository
    }

    override suspend fun doWork(): Result {
        val appContext = applicationContext
        val entryPoint = EntryPointAccessors.fromApplication(appContext, RestartWorkerEntryPoint::class.java)
        val enabled = entryPoint.settingsRepository().settingsFlow.first().controlEnabled
        if (enabled) DataMonitorService.start(appContext)
        return Result.success()
    }

    companion object {
        const val WORK_NAME = "data_monitor_restart_watchdog"
    }
}
