package com.jttools.datacontrol.data

import java.time.LocalDate

/**
 * Réglages persistés de l'application, avec leurs valeurs par défaut.
 */
data class AppSettings(
    val controlEnabled: Boolean = false,
    val planLimitMo: Long = 5000L,
    val planPriceEuro: Double = 19.99,
    val overagePricePerMoEuro: Double = 0.01,
    val planStartDateEpochDay: Long = LocalDate.now().toEpochDay(),
    val autoResetEnabled: Boolean = true,
    val cutoffIntervalMinutes: Int = 15,
    val baselineMobileBytesAtReset: Long = 0L,
    val whitelistedPackages: Set<String> = emptySet(),
    val whitelistedPackagesWifi: Set<String> = emptySet(),
    val wifiFilterEnabled: Boolean = false,
    val showSystemApps: Boolean = false,
    val passwordHash: String? = null,
    val passwordSalt: String? = null,
    val cutoffCycleAnchorMillis: Long? = null,
    val cutoffInPulse: Boolean = false,
    val cutoffPulseStartMillis: Long = 0L
) {
    val planStartDate: LocalDate get() = LocalDate.ofEpochDay(planStartDateEpochDay)

    /** Un mot de passe de verrouillage protège la désactivation du contrôle et l'accès aux réglages. */
    val hasPassword: Boolean get() = !passwordHash.isNullOrEmpty()

    /** Prochaine date de réinitialisation automatique (anniversaire mensuel du début de forfait). */
    fun nextAutoResetDate(): LocalDate {
        var next = planStartDate.plusMonths(1)
        val today = LocalDate.now()
        while (!next.isAfter(today)) {
            next = next.plusMonths(1)
        }
        return next
    }
}

/** État calculé de la consommation, dérivé des réglages + de la mesure de données réelle. */
data class UsageState(
    val consumedMo: Long,
    val planLimitMo: Long,
    val overageMo: Long,
    val isOverPlan: Boolean,
    val estimatedTotalPriceEuro: Double
) {
    val percentOfPlan: Float
        get() = if (planLimitMo <= 0) 0f else (consumedMo.toFloat() / planLimitMo.toFloat()).coerceAtLeast(0f)
}

enum class DataState {
    OK,      // sous le seuil d'alerte, liste blanche active, pas de coupure en cours
    WARNING, // proche ou au-delà du forfait (>= 80%), liste blanche active, pas de coupure en cours
    CUT,     // coupure totale cyclique en cours (indépendant du dépassement de forfait)
    WIFI     // Wi-Fi actif, aucun filtrage (sauf si filtrage Wi-Fi activé séparément)
}
