package com.jishisongfu.duobibi.heartbeat

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.SystemClock
import android.util.Log

/**
 * 用 AlarmManager 周期触发心跳。Android 19+ setRepeating 实际是 inexact(系统会
 * 合并/延迟到附近闹钟唤起,可能延迟 5-15 分钟),PoC 期足够 —— 我们关心的是
 * "心跳完全停了"vs"心跳还在",一两分钟的精度差不影响判定。
 *
 * 不用 setExactAndAllowWhileIdle:那需要 SCHEDULE_EXACT_ALARM 权限(Android 12+
 * 用户可拒绝),复杂度不值。Doze 模式下 inexact 闹钟也不会饿死太久(通常 15 分钟内能跑)。
 *
 * 如果实测发现心跳间隔被 Doze 拖到 30 分钟+,再换 setExact 方案。
 */
object HeartbeatScheduler {

    private const val TAG = "DUOBIBI-HB"
    private const val ALARM_REQ = 1001
    private const val INTERVAL_MS = 5 * 60 * 1000L  // 5 分钟,实测期偏短可观察更密

    fun start(context: Context) {
        val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val pi = pendingIntent(context)
        // setRepeating 在 API 19+ 实际等同 setInexactRepeating
        am.setInexactRepeating(
            AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + INTERVAL_MS,
            INTERVAL_MS,
            pi,
        )
        Log.i(TAG, "scheduler started, interval=${INTERVAL_MS}ms")
    }

    fun stop(context: Context) {
        val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        am.cancel(pendingIntent(context))
        Log.i(TAG, "scheduler stopped")
    }

    private fun pendingIntent(context: Context): PendingIntent {
        val intent = Intent(context, HeartbeatReceiver::class.java).apply {
            action = HeartbeatReceiver.ACTION_TICK
        }
        // FLAG_IMMUTABLE 是 Android 12+ 的硬要求,FLAG_UPDATE_CURRENT 让 cancel 能匹配到
        return PendingIntent.getBroadcast(
            context,
            ALARM_REQ,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
        )
    }
}
