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

package io.sentry.clientreport;

import java.util.Iterator;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import io.sentry.DataCategory;
import java.util.concurrent.ConcurrentHashMap;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicLong;
import java.util.Map;
import io.sentry.util.LazyEvaluator;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
final class AtomicClientReportStorage implements IClientReportStorage
{
    @NotNull
    private final LazyEvaluator<Map<ClientReportKey, AtomicLong>> lostEventCounts;
    
    public AtomicClientReportStorage() {
        this.lostEventCounts = new LazyEvaluator<Map<ClientReportKey, AtomicLong>>(() -> {
            final ConcurrentHashMap<Object, Object> modifyableEventCountsForInit = new ConcurrentHashMap<Object, Object>();
            DiscardReason.values();
            final DiscardReason[] array;
            int i = 0;
            for (int length = array.length; i < length; ++i) {
                final DiscardReason discardReason = array[i];
                DataCategory.values();
                final DataCategory[] array2;
                int j = 0;
                for (int length2 = array2.length; j < length2; ++j) {
                    final DataCategory category = array2[j];
                    modifyableEventCountsForInit.put(new ClientReportKey(discardReason.getReason(), category.getCategory()), new AtomicLong(0L));
                }
            }
            return Collections.unmodifiableMap((Map<?, ?>)modifyableEventCountsForInit);
        });
    }
    
    @Override
    public void addCount(final ClientReportKey key, final Long count) {
        final AtomicLong quantity = (AtomicLong)this.lostEventCounts.getValue().get(key);
        if (quantity != null) {
            quantity.addAndGet(count);
        }
    }
    
    @Override
    public List<DiscardedEvent> resetCountsAndGet() {
        final List<DiscardedEvent> discardedEvents = new ArrayList<DiscardedEvent>();
        final Set<Map.Entry<ClientReportKey, AtomicLong>> entrySet = this.lostEventCounts.getValue().entrySet();
        for (final Map.Entry<ClientReportKey, AtomicLong> entry : entrySet) {
            final Long quantity = entry.getValue().getAndSet(0L);
            if (quantity > 0L) {
                discardedEvents.add(new DiscardedEvent(entry.getKey().getReason(), entry.getKey().getCategory(), quantity));
            }
        }
        return discardedEvents;
    }
}
