package com.jttools.datacontrol.data

import android.net.TrafficStats
import javax.inject.Inject
import javax.inject.Singleton

/**
 * Mesure la consommation de données mobiles via TrafficStats (compteur cumulatif depuis
 * le dernier redémarrage de l'appareil, aucune permission spéciale requise).
 *
 * Le compteur total est comparé à une "baseline" capturée au dernier reset du forfait
 * (voir [SettingsRepository.resetPlan]) pour obtenir la consommation depuis le début du cycle.
 */
@Singleton
class UsageRepository @Inject constructor() {

    /** Total d'octets mobiles (émis + reçus) depuis le dernier redémarrage de l'appareil. -1 si indisponible. */
    fun totalMobileBytes(): Long {
        val rx = TrafficStats.getMobileRxBytes()
        val tx = TrafficStats.getMobileTxBytes()
        if (rx == TrafficStats.UNSUPPORTED.toLong() || tx == TrafficStats.UNSUPPORTED.toLong()) {
            return -1L
        }
        return rx + tx
    }

    /**
     * Octets consommés depuis [baselineBytes]. Si le compteur système est inférieur à la baseline
     * (redémarrage de l'appareil détecté), retourne 0 — l'appelant doit alors rebasculer la baseline.
     */
    fun consumedBytesSince(baselineBytes: Long): Long {
        val total = totalMobileBytes()
        if (total < 0) return 0L
        return (total - baselineBytes).coerceAtLeast(0L)
    }

    fun hasCounterReset(baselineBytes: Long): Boolean {
        val total = totalMobileBytes()
        return total in 0 until baselineBytes
    }

    companion object {
        fun bytesToMo(bytes: Long): Long = bytes / (1024L * 1024L)
        fun moToBytes(mo: Long): Long = mo * 1024L * 1024L
    }
}
