# =======================================
# 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

# =======================================
# 1. SDK PUBLIC API CLASSES
# =======================================

# Keep main SDK entry points
-keep public class com.ai.osmos.OsmosSDK {
    public *;
}

# Keep all public API classes from AdFetcherSDK
-keep public class com.ai.osmos.AdFetcherSDK.AdFetcherSDK {
    public *;
}

# Keep all public API classes from AdRenderSDK
-keep public class com.ai.osmos.AdRenderSDK.AdRenderer {
    public *;
}

# Keep all public View classes (UI components)
-keep public class com.ai.osmos.AdRenderSDK.BannerAdView {
    public *;
}

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

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

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

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

# Keep base classes and their public/protected members
-keep public class com.ai.osmos.AdRenderSDK.BaseAdView {
    public *;
    protected *;
}

-keep public class com.ai.osmos.AdRenderSDK.BaseAd {
    public *;
    protected *;
}

# Keep EventSDK public API
-keep public class com.ai.osmos.EventSDK.RegisterEvent {
    public *;
}

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

# =======================================
# 2. DATA MODELS FOR JSON PARSING
# =======================================

# Keep all configuration classes
-keep class com.ai.osmos.utils.Config { *; }
-keep class com.ai.osmos.utils.DisplayAdConfig { *; }
-keep class com.ai.osmos.utils.PLAAdConfig { *; }
-keep class com.ai.osmos.utils.RegisterEventConfig { *; }

# Keep all ad data models (used for JSON parsing)
-keep class com.ai.osmos.AdRenderSDK.AdData { *; }
-keep class com.ai.osmos.AdRenderSDK.ImageAd { *; }
-keep class com.ai.osmos.AdRenderSDK.VideoAd { *; }
-keep class com.ai.osmos.AdRenderSDK.CarouselAd { *; }
-keep class com.ai.osmos.AdRenderSDK.MultiAd { *; }

# Keep ad element models
-keep class com.ai.osmos.AdRenderSDK.AdElement { *; }
-keep class com.ai.osmos.AdRenderSDK.CarouselAdElement { *; }
-keep class com.ai.osmos.AdRenderSDK.MediaElement { *; }
-keep class com.ai.osmos.AdRenderSDK.LandingProductList { *; }
-keep class com.ai.osmos.AdRenderSDK.Coordinates { *; }
-keep class com.ai.osmos.AdRenderSDK.CarouselAdElementsWrapper { *; }

# Keep event data models
-keep class com.ai.osmos.EventSDK.RegisterEvent$Product { *; }

# Keep enums and their methods
-keep enum com.ai.osmos.AdRenderSDK.AdType {
    public *;
}

# =======================================
# 3. CALLBACK INTERFACES & LISTENERS
# =======================================

# Keep all callback function types (lambda expressions)
-keep class com.ai.osmos.AdRenderSDK.BaseAdView {
    *** setAdClickListener(...);
    *** setViewLoadListener(...);
    *** setAdItemClickListener(...);
}

# Keep callback-related method signatures
-keepclassmembers class * {
    *** *Listener*(...);
    *** *Callback*(...);
    *** onClick*(...);
    *** onLoad*(...);
}

# =======================================
# 4. NETWORKING & SERIALIZATION
# =======================================

# Keep JSON parsing classes
-keep class com.ai.osmos.AdRenderSDK.JSONParsing { *; }

# Keep WebService and related classes
-keep class com.ai.osmos.network.WebService {
    public *;
}

-keep class com.ai.osmos.network.WebConstants {
    public *;
}

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

# =======================================
# 5. EXTENSION FUNCTIONS
# =======================================

# Keep extension functions for ad conversion
-keep class com.ai.osmos.AdRenderSDK.BaseAdExtensionsKt {
    public *;
}

# =======================================
# 6. UTILITY CLASSES
# =======================================

# Keep configuration manager
-keep class com.ai.osmos.utils.ConfigManager {
    public *;
}

# Keep view utilities
-keep class com.ai.osmos.utils.ViewUtils {
    public *;
}

# =======================================
# 7. ANDROID FRAMEWORK COMPATIBILITY
# =======================================

# Keep Android framework interactions
-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 custom view constructors
-keepclassmembers class * extends com.ai.osmos.AdRenderSDK.BaseAdView {
    public <init>(...);
}

# =======================================
# 8. REFLECTION-SAFE RULES
# =======================================

# Preserve all public and protected fields/methods for data classes
-keepclassmembers class * {
    @androidx.annotation.Keep *;
}

# Keep data class properties (for JSON parsing)
-keepclassmembers class com.ai.osmos.AdRenderSDK.** {
    <fields>;
}

-keepclassmembers class com.ai.osmos.utils.** {
    <fields>;
}

-keepclassmembers class com.ai.osmos.EventSDK.** {
    <fields>;
}

# =======================================
# 9. COROUTINES & ASYNC OPERATIONS
# =======================================

# Keep coroutine-related code
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}

# =======================================
# 10. THIRD-PARTY LIBRARIES
# =======================================

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

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

# =======================================
# 11. LOGGING & DEBUG
# =======================================

# Keep debug logging classes
-keep class android.util.Log {
    public *;
}

# =======================================
# 12. ATTRIBUTES FOR DEBUGGING
# =======================================

# Preserve line numbers for debugging
-keepattributes SourceFile,LineNumberTable

# Keep annotations
-keepattributes *Annotation*

# Keep generic signatures
-keepattributes Signature

# Keep inner classes
-keepattributes InnerClasses

# Keep exception handling
-keepattributes Exceptions