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

package io.sentry.profiling;

import org.jetbrains.annotations.Nullable;
import java.util.Iterator;
import java.util.ServiceLoader;
import io.sentry.NoOpProfileConverter;
import io.sentry.ScopesAdapter;
import io.sentry.IProfileConverter;
import org.jetbrains.annotations.NotNull;
import io.sentry.NoOpContinuousProfiler;
import io.sentry.SentryLevel;
import io.sentry.IContinuousProfiler;
import io.sentry.ISentryExecutorService;
import io.sentry.ILogger;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
public final class ProfilingServiceLoader
{
    @NotNull
    public static IContinuousProfiler loadContinuousProfiler(final ILogger logger, final String profilingTracesDirPath, final int profilingTracesHz, final ISentryExecutorService executorService) {
        try {
            final JavaContinuousProfilerProvider provider = loadSingleProvider(JavaContinuousProfilerProvider.class);
            if (provider != null) {
                logger.log(SentryLevel.DEBUG, "Loaded continuous profiler from provider: %s", provider.getClass().getName());
                return provider.getContinuousProfiler(logger, profilingTracesDirPath, profilingTracesHz, executorService);
            }
            logger.log(SentryLevel.DEBUG, "No continuous profiler provider found, using NoOpContinuousProfiler", new Object[0]);
            return NoOpContinuousProfiler.getInstance();
        }
        catch (final Throwable t) {
            logger.log(SentryLevel.ERROR, "Failed to load continuous profiler provider, using NoOpContinuousProfiler", t);
            return NoOpContinuousProfiler.getInstance();
        }
    }
    
    @NotNull
    public static IProfileConverter loadProfileConverter() {
        final ILogger logger = ScopesAdapter.getInstance().getGlobalScope().getOptions().getLogger();
        try {
            final JavaProfileConverterProvider provider = loadSingleProvider(JavaProfileConverterProvider.class);
            if (provider != null) {
                logger.log(SentryLevel.DEBUG, "Loaded profile converter from provider: %s", provider.getClass().getName());
                return provider.getProfileConverter();
            }
            logger.log(SentryLevel.DEBUG, "No profile converter provider found, using NoOpProfileConverter", new Object[0]);
            return NoOpProfileConverter.getInstance();
        }
        catch (final Throwable t) {
            logger.log(SentryLevel.ERROR, "Failed to load profile converter provider, using NoOpProfileConverter", t);
            return NoOpProfileConverter.getInstance();
        }
    }
    
    @Nullable
    private static <T> T loadSingleProvider(final Class<T> clazz) {
        final ServiceLoader<T> serviceLoader = ServiceLoader.load(clazz);
        final Iterator<T> iterator = serviceLoader.iterator();
        if (iterator.hasNext()) {
            return iterator.next();
        }
        return null;
    }
}
