// 
// Decompiled by Procyon v0.6.0
// 

package io.sentry;

import org.jetbrains.annotations.TestOnly;
import java.util.Iterator;
import io.sentry.util.Objects;
import java.util.concurrent.CopyOnWriteArraySet;
import io.sentry.protocol.SentryPackage;
import java.util.Set;
import org.jetbrains.annotations.NotNull;
import io.sentry.util.AutoClosableReentrantLock;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
public final class SentryIntegrationPackageStorage
{
    @Nullable
    private static volatile SentryIntegrationPackageStorage INSTANCE;
    @NotNull
    private static final AutoClosableReentrantLock staticLock;
    @Nullable
    private static volatile Boolean mixedVersionsDetected;
    @NotNull
    private static final AutoClosableReentrantLock mixedVersionsLock;
    private final Set<String> integrations;
    private final Set<SentryPackage> packages;
    
    @NotNull
    public static SentryIntegrationPackageStorage getInstance() {
        if (SentryIntegrationPackageStorage.INSTANCE == null) {
            try (final ISentryLifecycleToken ignored = SentryIntegrationPackageStorage.staticLock.acquire()) {
                if (SentryIntegrationPackageStorage.INSTANCE == null) {
                    SentryIntegrationPackageStorage.INSTANCE = new SentryIntegrationPackageStorage();
                }
            }
        }
        return SentryIntegrationPackageStorage.INSTANCE;
    }
    
    private SentryIntegrationPackageStorage() {
        this.integrations = new CopyOnWriteArraySet<String>();
        this.packages = new CopyOnWriteArraySet<SentryPackage>();
    }
    
    public void addIntegration(@NotNull final String integration) {
        Objects.requireNonNull(integration, "integration is required.");
        this.integrations.add(integration);
    }
    
    @NotNull
    public Set<String> getIntegrations() {
        return this.integrations;
    }
    
    public void addPackage(@NotNull final String name, @NotNull final String version) {
        Objects.requireNonNull(name, "name is required.");
        Objects.requireNonNull(version, "version is required.");
        final SentryPackage newPackage = new SentryPackage(name, version);
        this.packages.add(newPackage);
        try (final ISentryLifecycleToken ignored = SentryIntegrationPackageStorage.mixedVersionsLock.acquire()) {
            SentryIntegrationPackageStorage.mixedVersionsDetected = null;
        }
    }
    
    @NotNull
    public Set<SentryPackage> getPackages() {
        return this.packages;
    }
    
    public boolean checkForMixedVersions(@NotNull final ILogger logger) {
        final Boolean mixedVersionsDetectedBefore = SentryIntegrationPackageStorage.mixedVersionsDetected;
        if (mixedVersionsDetectedBefore != null) {
            return mixedVersionsDetectedBefore;
        }
        try (final ISentryLifecycleToken ignored = SentryIntegrationPackageStorage.mixedVersionsLock.acquire()) {
            final String sdkVersion = "8.29.0";
            boolean mixedVersionsDetectedThisCheck = false;
            for (final SentryPackage pkg : this.packages) {
                if (pkg.getName().startsWith("maven:io.sentry:") && !"8.29.0".equalsIgnoreCase(pkg.getVersion())) {
                    logger.log(SentryLevel.ERROR, "The Sentry SDK has been configured with mixed versions. Expected %s to match core SDK version %s but was %s", pkg.getName(), "8.29.0", pkg.getVersion());
                    mixedVersionsDetectedThisCheck = true;
                }
            }
            if (mixedVersionsDetectedThisCheck) {
                logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^", new Object[0]);
                logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^", new Object[0]);
                logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^", new Object[0]);
                logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^", new Object[0]);
            }
            SentryIntegrationPackageStorage.mixedVersionsDetected = mixedVersionsDetectedThisCheck;
            return mixedVersionsDetectedThisCheck;
        }
    }
    
    @TestOnly
    public void clearStorage() {
        this.integrations.clear();
        this.packages.clear();
    }
    
    static {
        staticLock = new AutoClosableReentrantLock();
        SentryIntegrationPackageStorage.mixedVersionsDetected = null;
        mixedVersionsLock = new AutoClosableReentrantLock();
    }
}
