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

package com.hypixel.hytale.server.spawning.suppression.component;

import it.unimi.dsi.fastutil.ints.IntSets;
import javax.annotation.Nullable;
import it.unimi.dsi.fastutil.ints.IntSet;
import java.util.UUID;
import java.util.Collections;
import com.hypixel.hytale.server.spawning.SpawningPlugin;
import com.hypixel.hytale.component.ComponentType;
import javax.annotation.Nonnull;
import java.util.List;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import com.hypixel.hytale.component.Component;

public class ChunkSuppressionEntry implements Component<ChunkStore>
{
    @Nonnull
    private final List<SuppressionSpan> suppressionSpans;
    
    public static ComponentType<ChunkStore, ChunkSuppressionEntry> getComponentType() {
        return SpawningPlugin.get().getChunkSuppressionEntryComponentType();
    }
    
    public ChunkSuppressionEntry(@Nonnull final List<SuppressionSpan> suppressionSpans) {
        this.suppressionSpans = Collections.unmodifiableList((List<? extends SuppressionSpan>)suppressionSpans);
    }
    
    @Nonnull
    public List<SuppressionSpan> getSuppressionSpans() {
        return this.suppressionSpans;
    }
    
    public boolean containsOnly(final UUID suppressorId) {
        return this.suppressionSpans.size() == 1 && this.suppressionSpans.getFirst().getSuppressorId().equals(suppressorId);
    }
    
    public boolean isSuppressingRoleAt(final int roleIndex, final int yPosition) {
        for (int i = 0; i < this.suppressionSpans.size(); ++i) {
            final SuppressionSpan span = this.suppressionSpans.get(i);
            if (span.minY > yPosition) {
                return false;
            }
            if (span.maxY >= yPosition) {
                if (span.includesRole(roleIndex)) {
                    return true;
                }
            }
        }
        return false;
    }
    
    @Nonnull
    @Override
    public Component<ChunkStore> clone() {
        return new ChunkSuppressionEntry(this.suppressionSpans);
    }
    
    public static class SuppressionSpan
    {
        private final UUID suppressorId;
        private final int minY;
        private final int maxY;
        @Nullable
        private final IntSet suppressedRoles;
        
        public SuppressionSpan(final UUID suppressorId, final int minY, final int maxY, @Nullable final IntSet suppressedRoles) {
            this.suppressorId = suppressorId;
            this.minY = minY;
            this.maxY = maxY;
            this.suppressedRoles = ((suppressedRoles != null) ? IntSets.unmodifiable(suppressedRoles) : null);
        }
        
        public UUID getSuppressorId() {
            return this.suppressorId;
        }
        
        @Nullable
        public IntSet getSuppressedRoles() {
            return this.suppressedRoles;
        }
        
        public int getMinY() {
            return this.minY;
        }
        
        public int getMaxY() {
            return this.maxY;
        }
        
        public boolean includesRole(final int roleIndex) {
            return this.suppressedRoles == null || this.suppressedRoles.contains(roleIndex);
        }
    }
}
