package com.jishisongfu.duobibi

import android.app.Application
import com.jishisongfu.duobibi.auth.JgInit
import com.jishisongfu.duobibi.heartbeat.AppForegroundProbe
import com.jishisongfu.duobibi.heartbeat.HeartbeatScheduler
import com.jishisongfu.duobibi.heartbeat.HeartbeatSender
import com.jishisongfu.duobibi.push.MiPushBootstrap
import com.jishisongfu.duobibi.util.PrivacyPrefs
import dagger.hilt.android.HiltAndroidApp
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch

@HiltAndroidApp
class DuobibiApplication : Application() {

    private val appScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)

    override fun onCreate() {
        // 模拟器 IPv6 路由不通会让 socket connect 抛 ENETUNREACH (双栈 Socket
        // 默认走 IPv6 path 然后 fallback 失败,debug 联调 10.0.2.2 必踩)。
        // 强制只走 IPv4 stack。必须在任何 InetAddress/Socket 创建前设;
        // Application.onCreate 是进程内最早可控时机。
        // (单独靠 OkHttp Dns filter 不够 — Socket 类本身仍会创建 dual-stack。)
        System.setProperty("java.net.preferIPv4Stack", "true")
        System.setProperty("java.net.preferIPv6Addresses", "false")
        super.onCreate()
        // 必须最先初始化 —— 心跳里要查"App 在前台吗",靠 ActivityLifecycleCallbacks 维护
        AppForegroundProbe.init(this)

        // 小米推送 register(隐私 gate 内置)
        MiPushBootstrap.registerIfReady(this)

        // 极光一键登录 SDK init(隐私 gate 内置)
        JgInit.initIfReady(this)

        // 心跳调度 + 立刻补一次。仅在隐私同意后启动 —— 上报设备 ID/regId 属设备信息收集,
        // 合规边界跟推送一致。
        if (PrivacyPrefs.agreed(this)) {
            HeartbeatScheduler.start(this)
            appScope.launch { HeartbeatSender.send(this@DuobibiApplication, trigger = "app_create") }
        }
    }
}
