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

package io.sentry;

import java.util.concurrent.ConcurrentHashMap;
import java.util.Collection;
import io.sentry.vendor.gson.stream.JsonToken;
import java.io.IOException;
import java.util.Iterator;
import java.util.Locale;
import java.util.HashMap;
import java.util.ArrayList;
import org.jetbrains.annotations.Nullable;
import io.sentry.profilemeasurements.ProfileMeasurement;
import java.util.Map;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
public final class ProfilingTraceData implements JsonUnknown, JsonSerializable
{
    private static final String DEFAULT_ENVIRONMENT = "production";
    @ApiStatus.Internal
    public static final String TRUNCATION_REASON_NORMAL = "normal";
    @ApiStatus.Internal
    public static final String TRUNCATION_REASON_TIMEOUT = "timeout";
    @ApiStatus.Internal
    public static final String TRUNCATION_REASON_BACKGROUNDED = "backgrounded";
    @NotNull
    private final File traceFile;
    @NotNull
    private final Callable<List<Integer>> deviceCpuFrequenciesReader;
    private int androidApiLevel;
    @NotNull
    private String deviceLocale;
    @NotNull
    private String deviceManufacturer;
    @NotNull
    private String deviceModel;
    @NotNull
    private String deviceOsBuildNumber;
    @NotNull
    private String deviceOsName;
    @NotNull
    private String deviceOsVersion;
    private boolean deviceIsEmulator;
    @NotNull
    private String cpuArchitecture;
    @NotNull
    private List<Integer> deviceCpuFrequencies;
    @NotNull
    private String devicePhysicalMemoryBytes;
    @NotNull
    private String platform;
    @NotNull
    private String buildId;
    @NotNull
    private List<ProfilingTransactionData> transactions;
    @NotNull
    private String transactionName;
    @NotNull
    private String durationNs;
    @NotNull
    private String versionCode;
    @NotNull
    private String release;
    @NotNull
    private String transactionId;
    @NotNull
    private String traceId;
    @NotNull
    private String profileId;
    @NotNull
    private String environment;
    @NotNull
    private String truncationReason;
    @NotNull
    private Date timestamp;
    @NotNull
    private final Map<String, ProfileMeasurement> measurementsMap;
    @Nullable
    private String sampledProfile;
    @Nullable
    private Map<String, Object> unknown;
    
    private ProfilingTraceData() {
        this(new File("dummy"), NoOpTransaction.getInstance());
    }
    
    public ProfilingTraceData(@NotNull final File traceFile, @NotNull final ITransaction transaction) {
        this(traceFile, DateUtils.getCurrentDateTime(), (List<ProfilingTransactionData>)new ArrayList<ProfilingTransactionData>(), transaction.getName(), transaction.getEventId().toString(), transaction.getSpanContext().getTraceId().toString(), "0", 0, "", () -> new ArrayList(), (String)null, (String)null, (String)null, (Boolean)null, (String)null, (String)null, (String)null, (String)null, "normal", (Map<String, ProfileMeasurement>)new HashMap<String, ProfileMeasurement>());
    }
    
    public ProfilingTraceData(@NotNull final File traceFile, @NotNull final Date profileStartTimestamp, @NotNull final List<ProfilingTransactionData> transactions, @NotNull final String transactionName, @NotNull final String transactionId, @NotNull final String traceId, @NotNull final String durationNanos, final int sdkInt, @NotNull final String cpuArchitecture, @NotNull final Callable<List<Integer>> deviceCpuFrequenciesReader, @Nullable final String deviceManufacturer, @Nullable final String deviceModel, @Nullable final String deviceOsVersion, @Nullable final Boolean deviceIsEmulator, @Nullable final String devicePhysicalMemoryBytes, @Nullable final String buildId, @Nullable final String release, @Nullable final String environment, @NotNull final String truncationReason, @NotNull final Map<String, ProfileMeasurement> measurementsMap) {
        this.deviceCpuFrequencies = new ArrayList<Integer>();
        this.sampledProfile = null;
        this.traceFile = traceFile;
        this.timestamp = profileStartTimestamp;
        this.cpuArchitecture = cpuArchitecture;
        this.deviceCpuFrequenciesReader = deviceCpuFrequenciesReader;
        this.androidApiLevel = sdkInt;
        this.deviceLocale = Locale.getDefault().toString();
        this.deviceManufacturer = ((deviceManufacturer != null) ? deviceManufacturer : "");
        this.deviceModel = ((deviceModel != null) ? deviceModel : "");
        this.deviceOsVersion = ((deviceOsVersion != null) ? deviceOsVersion : "");
        this.deviceIsEmulator = (deviceIsEmulator != null && deviceIsEmulator);
        this.devicePhysicalMemoryBytes = ((devicePhysicalMemoryBytes != null) ? devicePhysicalMemoryBytes : "0");
        this.deviceOsBuildNumber = "";
        this.deviceOsName = "android";
        this.platform = "android";
        this.buildId = ((buildId != null) ? buildId : "");
        this.transactions = transactions;
        this.transactionName = (transactionName.isEmpty() ? "unknown" : transactionName);
        this.durationNs = durationNanos;
        this.versionCode = "";
        this.release = ((release != null) ? release : "");
        this.transactionId = transactionId;
        this.traceId = traceId;
        this.profileId = SentryUUID.generateSentryId();
        this.environment = ((environment != null) ? environment : "production");
        this.truncationReason = truncationReason;
        if (!this.isTruncationReasonValid()) {
            this.truncationReason = "normal";
        }
        this.measurementsMap = measurementsMap;
    }
    
    private boolean isTruncationReasonValid() {
        return this.truncationReason.equals("normal") || this.truncationReason.equals("timeout") || this.truncationReason.equals("backgrounded");
    }
    
    @NotNull
    public File getTraceFile() {
        return this.traceFile;
    }
    
    public int getAndroidApiLevel() {
        return this.androidApiLevel;
    }
    
    @NotNull
    public String getCpuArchitecture() {
        return this.cpuArchitecture;
    }
    
    @NotNull
    public String getDeviceLocale() {
        return this.deviceLocale;
    }
    
    @NotNull
    public String getDeviceManufacturer() {
        return this.deviceManufacturer;
    }
    
    @NotNull
    public String getDeviceModel() {
        return this.deviceModel;
    }
    
    @NotNull
    public String getDeviceOsBuildNumber() {
        return this.deviceOsBuildNumber;
    }
    
    @NotNull
    public String getDeviceOsName() {
        return this.deviceOsName;
    }
    
    @NotNull
    public String getDeviceOsVersion() {
        return this.deviceOsVersion;
    }
    
    public boolean isDeviceIsEmulator() {
        return this.deviceIsEmulator;
    }
    
    @NotNull
    public String getPlatform() {
        return this.platform;
    }
    
    @NotNull
    public String getBuildId() {
        return this.buildId;
    }
    
    @NotNull
    public String getTransactionName() {
        return this.transactionName;
    }
    
    @NotNull
    public String getRelease() {
        return this.release;
    }
    
    @NotNull
    public String getTransactionId() {
        return this.transactionId;
    }
    
    @NotNull
    public List<ProfilingTransactionData> getTransactions() {
        return this.transactions;
    }
    
    @NotNull
    public String getTraceId() {
        return this.traceId;
    }
    
    @NotNull
    public String getProfileId() {
        return this.profileId;
    }
    
    @NotNull
    public String getEnvironment() {
        return this.environment;
    }
    
    @Nullable
    public String getSampledProfile() {
        return this.sampledProfile;
    }
    
    @NotNull
    public String getDurationNs() {
        return this.durationNs;
    }
    
    @NotNull
    public List<Integer> getDeviceCpuFrequencies() {
        return this.deviceCpuFrequencies;
    }
    
    @NotNull
    public String getDevicePhysicalMemoryBytes() {
        return this.devicePhysicalMemoryBytes;
    }
    
    @NotNull
    public String getTruncationReason() {
        return this.truncationReason;
    }
    
    @NotNull
    public Date getTimestamp() {
        return this.timestamp;
    }
    
    @NotNull
    public Map<String, ProfileMeasurement> getMeasurementsMap() {
        return this.measurementsMap;
    }
    
    public void setAndroidApiLevel(final int androidApiLevel) {
        this.androidApiLevel = androidApiLevel;
    }
    
    public void setCpuArchitecture(@NotNull final String cpuArchitecture) {
        this.cpuArchitecture = cpuArchitecture;
    }
    
    public void setDeviceLocale(@NotNull final String deviceLocale) {
        this.deviceLocale = deviceLocale;
    }
    
    public void setDeviceManufacturer(@NotNull final String deviceManufacturer) {
        this.deviceManufacturer = deviceManufacturer;
    }
    
    public void setDeviceModel(@NotNull final String deviceModel) {
        this.deviceModel = deviceModel;
    }
    
    public void setDeviceOsBuildNumber(@NotNull final String deviceOsBuildNumber) {
        this.deviceOsBuildNumber = deviceOsBuildNumber;
    }
    
    public void setDeviceOsVersion(@NotNull final String deviceOsVersion) {
        this.deviceOsVersion = deviceOsVersion;
    }
    
    public void setDeviceIsEmulator(final boolean deviceIsEmulator) {
        this.deviceIsEmulator = deviceIsEmulator;
    }
    
    public void setDeviceCpuFrequencies(@NotNull final List<Integer> deviceCpuFrequencies) {
        this.deviceCpuFrequencies = deviceCpuFrequencies;
    }
    
    public void setDevicePhysicalMemoryBytes(@NotNull final String devicePhysicalMemoryBytes) {
        this.devicePhysicalMemoryBytes = devicePhysicalMemoryBytes;
    }
    
    public void setTimestamp(@NotNull final Date timestamp) {
        this.timestamp = timestamp;
    }
    
    public void setTruncationReason(@NotNull final String truncationReason) {
        this.truncationReason = truncationReason;
    }
    
    public void setTransactions(@NotNull final List<ProfilingTransactionData> transactions) {
        this.transactions = transactions;
    }
    
    public void setBuildId(@NotNull final String buildId) {
        this.buildId = buildId;
    }
    
    public void setTransactionName(@NotNull final String transactionName) {
        this.transactionName = transactionName;
    }
    
    public void setDurationNs(@NotNull final String durationNs) {
        this.durationNs = durationNs;
    }
    
    public void setRelease(@NotNull final String release) {
        this.release = release;
    }
    
    public void setTransactionId(@NotNull final String transactionId) {
        this.transactionId = transactionId;
    }
    
    public void setTraceId(@NotNull final String traceId) {
        this.traceId = traceId;
    }
    
    public void setProfileId(@NotNull final String profileId) {
        this.profileId = profileId;
    }
    
    public void setEnvironment(@NotNull final String environment) {
        this.environment = environment;
    }
    
    public void setSampledProfile(@Nullable final String sampledProfile) {
        this.sampledProfile = sampledProfile;
    }
    
    public void readDeviceCpuFrequencies() {
        try {
            this.deviceCpuFrequencies = this.deviceCpuFrequenciesReader.call();
        }
        catch (final Throwable t) {}
    }
    
    @Override
    public void serialize(@NotNull final ObjectWriter writer, @NotNull final ILogger logger) throws IOException {
        writer.beginObject();
        writer.name("android_api_level").value(logger, this.androidApiLevel);
        writer.name("device_locale").value(logger, this.deviceLocale);
        writer.name("device_manufacturer").value(this.deviceManufacturer);
        writer.name("device_model").value(this.deviceModel);
        writer.name("device_os_build_number").value(this.deviceOsBuildNumber);
        writer.name("device_os_name").value(this.deviceOsName);
        writer.name("device_os_version").value(this.deviceOsVersion);
        writer.name("device_is_emulator").value(this.deviceIsEmulator);
        writer.name("architecture").value(logger, this.cpuArchitecture);
        writer.name("device_cpu_frequencies").value(logger, this.deviceCpuFrequencies);
        writer.name("device_physical_memory_bytes").value(this.devicePhysicalMemoryBytes);
        writer.name("platform").value(this.platform);
        writer.name("build_id").value(this.buildId);
        writer.name("transaction_name").value(this.transactionName);
        writer.name("duration_ns").value(this.durationNs);
        writer.name("version_name").value(this.release);
        writer.name("version_code").value(this.versionCode);
        if (!this.transactions.isEmpty()) {
            writer.name("transactions").value(logger, this.transactions);
        }
        writer.name("transaction_id").value(this.transactionId);
        writer.name("trace_id").value(this.traceId);
        writer.name("profile_id").value(this.profileId);
        writer.name("environment").value(this.environment);
        writer.name("truncation_reason").value(this.truncationReason);
        if (this.sampledProfile != null) {
            writer.name("sampled_profile").value(this.sampledProfile);
        }
        final String prevIndent = writer.getIndent();
        writer.setIndent("");
        writer.name("measurements").value(logger, this.measurementsMap);
        writer.setIndent(prevIndent);
        writer.name("timestamp").value(logger, this.timestamp);
        if (this.unknown != null) {
            for (final String key : this.unknown.keySet()) {
                final Object value = this.unknown.get(key);
                writer.name(key);
                writer.value(logger, value);
            }
        }
        writer.endObject();
    }
    
    @Nullable
    @Override
    public Map<String, Object> getUnknown() {
        return this.unknown;
    }
    
    @Override
    public void setUnknown(@Nullable final Map<String, Object> unknown) {
        this.unknown = unknown;
    }
    
    public static final class JsonKeys
    {
        public static final String ANDROID_API_LEVEL = "android_api_level";
        public static final String DEVICE_LOCALE = "device_locale";
        public static final String DEVICE_MANUFACTURER = "device_manufacturer";
        public static final String DEVICE_MODEL = "device_model";
        public static final String DEVICE_OS_BUILD_NUMBER = "device_os_build_number";
        public static final String DEVICE_OS_NAME = "device_os_name";
        public static final String DEVICE_OS_VERSION = "device_os_version";
        public static final String DEVICE_IS_EMULATOR = "device_is_emulator";
        public static final String ARCHITECTURE = "architecture";
        public static final String DEVICE_CPU_FREQUENCIES = "device_cpu_frequencies";
        public static final String DEVICE_PHYSICAL_MEMORY_BYTES = "device_physical_memory_bytes";
        public static final String PLATFORM = "platform";
        public static final String BUILD_ID = "build_id";
        public static final String TRANSACTION_NAME = "transaction_name";
        public static final String DURATION_NS = "duration_ns";
        public static final String RELEASE = "version_name";
        public static final String VERSION_CODE = "version_code";
        public static final String TRANSACTION_LIST = "transactions";
        public static final String TRANSACTION_ID = "transaction_id";
        public static final String TRACE_ID = "trace_id";
        public static final String PROFILE_ID = "profile_id";
        public static final String ENVIRONMENT = "environment";
        public static final String SAMPLED_PROFILE = "sampled_profile";
        public static final String TRUNCATION_REASON = "truncation_reason";
        public static final String MEASUREMENTS = "measurements";
        public static final String TIMESTAMP = "timestamp";
    }
    
    public static final class Deserializer implements JsonDeserializer<ProfilingTraceData>
    {
        @NotNull
        @Override
        public ProfilingTraceData deserialize(@NotNull final ObjectReader reader, @NotNull final ILogger logger) throws Exception {
            reader.beginObject();
            final ProfilingTraceData data = new ProfilingTraceData(null);
            Map<String, Object> unknown = null;
            while (reader.peek() == JsonToken.NAME) {
                final String nextName2;
                final String nextName = nextName2 = reader.nextName();
                switch (nextName2) {
                    case "android_api_level": {
                        final Integer apiLevel = reader.nextIntegerOrNull();
                        if (apiLevel != null) {
                            data.androidApiLevel = apiLevel;
                            continue;
                        }
                        continue;
                    }
                    case "device_locale": {
                        final String deviceLocale = reader.nextStringOrNull();
                        if (deviceLocale != null) {
                            data.deviceLocale = deviceLocale;
                            continue;
                        }
                        continue;
                    }
                    case "device_manufacturer": {
                        final String deviceManufacturer = reader.nextStringOrNull();
                        if (deviceManufacturer != null) {
                            data.deviceManufacturer = deviceManufacturer;
                            continue;
                        }
                        continue;
                    }
                    case "device_model": {
                        final String deviceModel = reader.nextStringOrNull();
                        if (deviceModel != null) {
                            data.deviceModel = deviceModel;
                            continue;
                        }
                        continue;
                    }
                    case "device_os_build_number": {
                        final String deviceOsBuildNumber = reader.nextStringOrNull();
                        if (deviceOsBuildNumber != null) {
                            data.deviceOsBuildNumber = deviceOsBuildNumber;
                            continue;
                        }
                        continue;
                    }
                    case "device_os_name": {
                        final String deviceOsName = reader.nextStringOrNull();
                        if (deviceOsName != null) {
                            data.deviceOsName = deviceOsName;
                            continue;
                        }
                        continue;
                    }
                    case "device_os_version": {
                        final String deviceOsVersion = reader.nextStringOrNull();
                        if (deviceOsVersion != null) {
                            data.deviceOsVersion = deviceOsVersion;
                            continue;
                        }
                        continue;
                    }
                    case "device_is_emulator": {
                        final Boolean deviceIsEmulator = reader.nextBooleanOrNull();
                        if (deviceIsEmulator != null) {
                            data.deviceIsEmulator = deviceIsEmulator;
                            continue;
                        }
                        continue;
                    }
                    case "architecture": {
                        final String cpuArchitecture = reader.nextStringOrNull();
                        if (cpuArchitecture != null) {
                            data.cpuArchitecture = cpuArchitecture;
                            continue;
                        }
                        continue;
                    }
                    case "device_cpu_frequencies": {
                        final List<Integer> deviceCpuFrequencies = (List<Integer>)reader.nextObjectOrNull();
                        if (deviceCpuFrequencies != null) {
                            data.deviceCpuFrequencies = deviceCpuFrequencies;
                            continue;
                        }
                        continue;
                    }
                    case "device_physical_memory_bytes": {
                        final String devicePhysicalMemoryBytes = reader.nextStringOrNull();
                        if (devicePhysicalMemoryBytes != null) {
                            data.devicePhysicalMemoryBytes = devicePhysicalMemoryBytes;
                            continue;
                        }
                        continue;
                    }
                    case "platform": {
                        final String platform = reader.nextStringOrNull();
                        if (platform != null) {
                            data.platform = platform;
                            continue;
                        }
                        continue;
                    }
                    case "build_id": {
                        final String buildId = reader.nextStringOrNull();
                        if (buildId != null) {
                            data.buildId = buildId;
                            continue;
                        }
                        continue;
                    }
                    case "transaction_name": {
                        final String transactionName = reader.nextStringOrNull();
                        if (transactionName != null) {
                            data.transactionName = transactionName;
                            continue;
                        }
                        continue;
                    }
                    case "duration_ns": {
                        final String durationNs = reader.nextStringOrNull();
                        if (durationNs != null) {
                            data.durationNs = durationNs;
                            continue;
                        }
                        continue;
                    }
                    case "version_code": {
                        final String versionCode = reader.nextStringOrNull();
                        if (versionCode != null) {
                            data.versionCode = versionCode;
                            continue;
                        }
                        continue;
                    }
                    case "version_name": {
                        final String versionName = reader.nextStringOrNull();
                        if (versionName != null) {
                            data.release = versionName;
                            continue;
                        }
                        continue;
                    }
                    case "transactions": {
                        final List<ProfilingTransactionData> transactions = reader.nextListOrNull(logger, (JsonDeserializer<ProfilingTransactionData>)new ProfilingTransactionData.Deserializer());
                        if (transactions != null) {
                            data.transactions.addAll(transactions);
                            continue;
                        }
                        continue;
                    }
                    case "transaction_id": {
                        final String transactionId = reader.nextStringOrNull();
                        if (transactionId != null) {
                            data.transactionId = transactionId;
                            continue;
                        }
                        continue;
                    }
                    case "trace_id": {
                        final String traceId = reader.nextStringOrNull();
                        if (traceId != null) {
                            data.traceId = traceId;
                            continue;
                        }
                        continue;
                    }
                    case "profile_id": {
                        final String profileId = reader.nextStringOrNull();
                        if (profileId != null) {
                            data.profileId = profileId;
                            continue;
                        }
                        continue;
                    }
                    case "environment": {
                        final String environment = reader.nextStringOrNull();
                        if (environment != null) {
                            data.environment = environment;
                            continue;
                        }
                        continue;
                    }
                    case "truncation_reason": {
                        final String truncationReason = reader.nextStringOrNull();
                        if (truncationReason != null) {
                            data.truncationReason = truncationReason;
                            continue;
                        }
                        continue;
                    }
                    case "measurements": {
                        final Map<String, ProfileMeasurement> measurements = reader.nextMapOrNull(logger, (JsonDeserializer<ProfileMeasurement>)new ProfileMeasurement.Deserializer());
                        if (measurements != null) {
                            data.measurementsMap.putAll(measurements);
                            continue;
                        }
                        continue;
                    }
                    case "timestamp": {
                        final Date timestamp = reader.nextDateOrNull(logger);
                        if (timestamp != null) {
                            data.timestamp = timestamp;
                            continue;
                        }
                        continue;
                    }
                    case "sampled_profile": {
                        final String sampledProfile = reader.nextStringOrNull();
                        if (sampledProfile != null) {
                            data.sampledProfile = sampledProfile;
                            continue;
                        }
                        continue;
                    }
                    default: {
                        if (unknown == null) {
                            unknown = new ConcurrentHashMap<String, Object>();
                        }
                        reader.nextUnknown(logger, unknown, nextName);
                        continue;
                    }
                }
            }
            data.setUnknown(unknown);
            reader.endObject();
            return data;
        }
    }
}
