# =======================================
# OSMOS Android SDK Consumer ProGuard Rules
# =======================================
# These rules are applied to apps that use the OSMOS SDK
# They preserve the public API and prevent obfuscation issues when
# the consuming app enables ProGuard/R8 minification

# =======================================
# 1. CORE SDK CLASSES (Public API)
# =======================================

# Main SDK entry point - must be preserved for consumer apps
-keep public class com.ai.osmos.core.OsmosSDK {
    public *;
}

# SDK builder for fluent configuration
-keep public class com.ai.osmos.core.OsmosSDKBuilder {
    public *;
}

# Configuration classes
-keep public class com.ai.osmos.core.Config {
    public *;
}

# =======================================
# 2. AD VIEW MANAGER CLASSES (Public API)
# =======================================

# Keep all manager classes and their public methods
-keep public class com.ai.osmos.ads.views.managers.BannerAdViewManager {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.CarouselAdViewManager {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.InterstitialAdViewManager {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.PIPAdViewManager {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.MultiAdCarouselViewManager {
    public *;
}

# Keep optional parameter classes for ad managers
-keep public class com.ai.osmos.ads.views.managers.BannerAdOptionalParams {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.CarouselAdOptionalParams {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.InterstitialAdOptionalParams {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.PIPAdOptionalParams {
    public *;
}

-keep public class com.ai.osmos.ads.views.managers.MultiAdCarouselOptionalParams {
    public *;
}

# =======================================
# 3. AD VIEW CLASSES (Public API)
# =======================================

# Main ad view classes that consumers can use directly
-keep public class com.ai.osmos.ads.views.BannerAdView {
    public *;
}

-keep public class com.ai.osmos.ads.views.CarouselAdView {
    public *;
}

-keep public class com.ai.osmos.ads.views.InterstitialAdView {
    public *;
}

-keep public class com.ai.osmos.ads.views.PIPAdView {
    public *;
}

-keep public class com.ai.osmos.ads.views.MultiAdCarouselView {
    public *;
}

# Support classes for ad views
-keep public class com.ai.osmos.ads.views.Coordinates {
    public *;
}

# =======================================
# 4. INTERFACE CLASSES (Public API)
# =======================================

-keep public interface com.ai.osmos.ads.fetcher.AdFetcherSDKInterface {
    public *;
}

-keep public interface com.ai.osmos.ads.renderer.AdRendererInterface {
    public *;
}

-keep public interface com.ai.osmos.tracking.events.RegisterEventInterface {
    public *;
}

-keep public interface com.ai.osmos.utils.error.ErrorCallback {
    public *;
}

# =======================================
# 5. DATA MODELS & CONFIGURATION
# =======================================

# Keep all data models needed for JSON parsing and API responses
-keep class com.ai.osmos.models.ads.** { *; }

# Keep tracking data models
-keep class com.ai.osmos.tracking.data.** { *; }

# Keep event models and enums
-keep class com.ai.osmos.models.events.** { *; }
-keep enum com.ai.osmos.models.** { *; }

# Keep error handling classes
-keep class com.ai.osmos.utils.error.OsmosError { *; }
-keep class com.ai.osmos.utils.error.ExceptionHandler { *; }
-keep class com.ai.osmos.utils.error.StandardErrorHandler { *; }

# =======================================
# 6. ANDROID VIEW SYSTEM COMPATIBILITY
# =======================================

# Keep Android View constructors for proper inflation
-keepclassmembers class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

# Keep View constructors for ad views specifically
-keepclassmembers class com.ai.osmos.ads.views.** {
    public <init>(...);
}

# =======================================
# 7. REFLECTION & CALLBACK PRESERVATION
# =======================================

# Keep callback methods that may be called via reflection
-keepclassmembers class * {
    *** *Callback*(...);
    *** *Listener*(...);
    *** onClick*(...);
    *** onLoad*(...);
    *** onError*(...);
}

# Keep fields that might be accessed via reflection
-keepclassmembers class com.ai.osmos.models.** {
    <fields>;
}

# =======================================
# 8. KOTLIN-SPECIFIC RULES
# =======================================

# Keep Kotlin metadata for proper interop
-keepattributes *Annotation*
-keepattributes Signature
-keepattributes InnerClasses

# Keep companion objects and their methods
-keep class **$Companion {
    public *;
}

# Keep extension functions
-keep class **Kt {
    public *;
}

# =======================================
# 9. COROUTINES & ASYNC SUPPORT
# =======================================

# Keep coroutine classes for async operations
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembers class kotlinx.coroutines.** {
    public *;
}

# =======================================
# 10. THIRD-PARTY LIBRARY COMPATIBILITY
# =======================================

# Media3 ExoPlayer support (compileOnly dependency)
-keep class androidx.media3.** { *; }
-dontwarn androidx.media3.**

# WorkManager support (compileOnly dependency) 
-keep class androidx.work.** { *; }
-keep class * extends androidx.work.Worker { *; }
-keep class * extends androidx.work.CoroutineWorker { *; }
-dontwarn androidx.work.**

# RecyclerView support (compileOnly dependency)
-keep class androidx.recyclerview.** { *; }
-dontwarn androidx.recyclerview.**

# OkHttp networking
-dontwarn okhttp3.**
-dontwarn okio.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

# =======================================
# 11. DEBUGGING & STACK TRACES
# =======================================

# Keep source file names and line numbers for better stack traces
-keepattributes SourceFile,LineNumberTable

# Keep exception information
-keepattributes Exceptions

# Keep parameter names for better debugging
-keepparameternames

# =======================================
# 12. GENERAL COMPATIBILITY RULES
# =======================================

# Keep enum valueOf and values methods
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Keep serialization support
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

# Suppress common warnings that don't affect functionality
-dontwarn java.lang.invoke.StringConcatFactory