package com.notifyhub.viewer.data.prefs import android.content.Context import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey import com.notifyhub.viewer.data.remote.BrandingPayload import com.notifyhub.viewer.data.remote.CompanySummary import com.notifyhub.viewer.data.remote.Permissions import com.google.gson.Gson class SecurePreferences(context: Context) { private val prefs = EncryptedSharedPreferences.create( context, FILE_NAME, MasterKey.Builder(context).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build(), EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM, ) private val gson = Gson() var apiToken: String? get() = prefs.getString(KEY_API_TOKEN, null) set(value) = prefs.edit().putString(KEY_API_TOKEN, value).apply() var profileJson: String? get() = prefs.getString(KEY_PROFILE, null) set(value) = prefs.edit().putString(KEY_PROFILE, value).apply() var permissionsJson: String? get() = prefs.getString(KEY_PERMISSIONS, null) set(value) = prefs.edit().putString(KEY_PERMISSIONS, value).apply() var brandAppName: String? get() = prefs.getString(KEY_BRAND_APP_NAME, null) set(value) = prefs.edit().putString(KEY_BRAND_APP_NAME, value).apply() var brandLogoUrl: String? get() = prefs.getString(KEY_BRAND_LOGO_URL, null) set(value) = prefs.edit().putString(KEY_BRAND_LOGO_URL, value).apply() var companyName: String? get() = prefs.getString(KEY_COMPANY_NAME, null) set(value) = prefs.edit().putString(KEY_COMPANY_NAME, value).apply() var companyNumber: String? get() = prefs.getString(KEY_COMPANY_NUMBER, null) set(value) = prefs.edit().putString(KEY_COMPANY_NUMBER, value).apply() var subscriptionPlan: String? get() = prefs.getString(KEY_SUBSCRIPTION_PLAN, null) set(value) = prefs.edit().putString(KEY_SUBSCRIPTION_PLAN, value).apply() var subscriptionPerpetual: Boolean get() = prefs.getBoolean(KEY_SUBSCRIPTION_PERPETUAL, false) set(value) = prefs.edit().putBoolean(KEY_SUBSCRIPTION_PERPETUAL, value).apply() var subscriptionRetentionDays: Int? get() = if (prefs.contains(KEY_SUBSCRIPTION_RETENTION)) prefs.getInt(KEY_SUBSCRIPTION_RETENTION, 0) else null set(value) { val edit = prefs.edit() if (value == null) { edit.remove(KEY_SUBSCRIPTION_RETENTION) } else { edit.putInt(KEY_SUBSCRIPTION_RETENTION, value) } edit.apply() } var pushToken: String? get() = prefs.getString(KEY_PUSH_TOKEN, null) set(value) = prefs.edit().putString(KEY_PUSH_TOKEN, value).apply() fun hasPage(page: String): Boolean { val json = permissionsJson ?: return false return runCatching { gson.fromJson(json, Permissions::class.java).pages.contains(page) }.getOrDefault(false) } fun hasAction(action: String): Boolean { val json = permissionsJson ?: return false return runCatching { gson.fromJson(json, Permissions::class.java).actions.contains(action) }.getOrDefault(false) } fun applyBranding(branding: BrandingPayload?) { if (branding == null) return brandAppName = branding.appName?.takeIf { it.isNotBlank() } brandLogoUrl = branding.logoUrl?.takeIf { it.isNotBlank() } } fun applyCompany(company: CompanySummary?) { if (company == null) return companyName = company.name?.takeIf { it.isNotBlank() } companyNumber = company.companyNumber?.takeIf { it.isNotBlank() } subscriptionPlan = company.subscription?.planName subscriptionPerpetual = company.subscription?.isPerpetual ?: false subscriptionRetentionDays = company.subscription?.dataRetentionDays } fun clearSession() { prefs.edit().clear().apply() } fun isLoggedIn(): Boolean = !apiToken.isNullOrBlank() companion object { private const val FILE_NAME = "notiz_viewer_secure_prefs" private const val KEY_API_TOKEN = "api_token" private const val KEY_PROFILE = "profile" private const val KEY_PERMISSIONS = "permissions" private const val KEY_BRAND_APP_NAME = "brand_app_name" private const val KEY_BRAND_LOGO_URL = "brand_logo_url" private const val KEY_COMPANY_NAME = "company_name" private const val KEY_COMPANY_NUMBER = "company_number" private const val KEY_SUBSCRIPTION_PLAN = "subscription_plan" private const val KEY_SUBSCRIPTION_PERPETUAL = "subscription_perpetual" private const val KEY_SUBSCRIPTION_RETENTION = "subscription_retention_days" private const val KEY_PUSH_TOKEN = "push_token" } }