# ============================================================================
# Judo3DS2 Android SDK - Consumer ProGuard/R8 Rules
# ============================================================================
# These rules are automatically included when consumers use this library.
# They ensure proper functionality when the consuming app enables minification.
# ============================================================================

# ----------------------------------------------------------------------------
# BouncyCastle Cryptography Library
# ----------------------------------------------------------------------------
# Required for JWE encryption/decryption operations in 3DS2 authentication
-keep class org.bouncycastle.jcajce.provider.** { *; }
-keep class org.bouncycastle.jce.provider.** { *; }
-keep class !org.bouncycastle.jce.provider.X509LDAPCertStoreSpi,org.bouncycastle.jce.provider.** { *; }

# ----------------------------------------------------------------------------
# Google Tink (optional dependency warning suppression)
# ----------------------------------------------------------------------------
-dontwarn com.google.crypto.tink.**

# ----------------------------------------------------------------------------
# Nimbus JOSE+JWT issues with R8 full mode
# https://bitbucket.org/connect2id/nimbus-jose-jwt/issues/518/using-r8-full-mode-causes-issues
# ----------------------------------------------------------------------------
-dontwarn net.jcip.annotations.Immutable
-dontwarn net.jcip.annotations.ThreadSafe
-keep class com.nimbusds.jose.shaded.gson.reflect.TypeToken { *; }
-keep class * extends com.nimbusds.jose.shaded.gson.reflect.TypeToken

# ----------------------------------------------------------------------------
# Public API - Model Classes
# ----------------------------------------------------------------------------
# Data classes used in callbacks and API responses
-keep class com.judopay.judo3ds2.model.** { *; }

# ----------------------------------------------------------------------------
# Public API - Customization Classes
# ----------------------------------------------------------------------------
# UI customization classes (Parcelable) that consumers use to style the SDK
-keep class com.judopay.judo3ds2.customization.** { *; }

# ----------------------------------------------------------------------------
# Public API - Exception Classes
# ----------------------------------------------------------------------------
# All exceptions that can be thrown to consumers
-keep class com.judopay.judo3ds2.exception.** { *; }

# ----------------------------------------------------------------------------
# Internal - API Models (Gson Serialization)
# ----------------------------------------------------------------------------
# These classes use Gson for JSON serialization and require reflection
-keep class com.judopay.judo3ds2.api.model.** { *; }

# ----------------------------------------------------------------------------
# Internal - Device Parameters
# ----------------------------------------------------------------------------
# Device data gathering for 3DS2 authentication
-keep class com.judopay.judo3ds2.parameters.** { *; }

# ----------------------------------------------------------------------------
# Android Components
# ----------------------------------------------------------------------------
# Keep the ChallengeActivity as it's declared in AndroidManifest
-keep class com.judopay.judo3ds2.ui.challenge.ChallengeActivity { *; }

# Keep Gson serialization annotations
-keepattributes Signature

# Gson specific rules for serialized fields
-keepclassmembers class com.judopay.judo3ds2.api.model.** {
    <fields>;
    <init>(...);
}

# ----------------------------------------------------------------------------
# Kotlin Specific Rules
# ----------------------------------------------------------------------------
# Preserve Kotlin metadata for reflection
-keepattributes RuntimeVisibleAnnotations

# Keep Kotlin data class component functions and copy methods
-keepclassmembers class com.judopay.judo3ds2.model.** {
    public ** component*();
    public ** copy(...);
}
-keepclassmembers class com.judopay.judo3ds2.api.model.** {
    public ** component*();
    public ** copy(...);
}
-keepclassmembers class com.judopay.judo3ds2.customization.** {
    public ** component*();
    public ** copy(...);
}
-keepclassmembers class com.judopay.judo3ds2.transaction.challenge.ChallengeParameters {
    public ** component*();
    public ** copy(...);
}
-keepclassmembers class com.judopay.judo3ds2.transaction.challenge.ErrorMessage {
    public ** component*();
    public ** copy(...);
}

# ----------------------------------------------------------------------------
# Parcelable Classes
# ----------------------------------------------------------------------------
# Keep Parcelable CREATOR fields for Android serialization
-keepclassmembers class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator CREATOR;
}

# ----------------------------------------------------------------------------
# Enum Classes
# ----------------------------------------------------------------------------
# Preserve enum values used in API responses and configurations
-keepclassmembers enum com.judopay.judo3ds2.** {
    public static **[] values();
    public static ** valueOf(java.lang.String);
    **[] $VALUES;
    public *;
}
