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

package com.hypixel.hytale.component.data.unknown;

import com.hypixel.hytale.codec.KeyedCodec;
import java.util.function.Supplier;
import com.hypixel.hytale.codec.codecs.map.MapCodec;
import javax.annotation.Nullable;
import org.bson.BsonValue;
import com.hypixel.hytale.codec.ExtraInfo;
import com.hypixel.hytale.codec.Codec;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.bson.BsonDocument;
import java.util.Map;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import javax.annotation.Nonnull;
import com.hypixel.hytale.logger.HytaleLogger;
import com.hypixel.hytale.component.Component;

public class UnknownComponents<ECS_TYPE> implements Component<ECS_TYPE>
{
    @Nonnull
    public static final HytaleLogger LOGGER;
    @Nonnull
    public static final String ID = "Unknown";
    @Nonnull
    public static final BuilderCodec<UnknownComponents> CODEC;
    @Nonnull
    private Map<String, BsonDocument> unknownComponents;
    
    public UnknownComponents() {
        this.unknownComponents = new Object2ObjectOpenHashMap<String, BsonDocument>();
    }
    
    public UnknownComponents(@Nonnull final Map<String, BsonDocument> unknownComponents) {
        this.unknownComponents = unknownComponents;
    }
    
    public void addComponent(@Nonnull final String componentId, @Nonnull final Component<ECS_TYPE> component, @Nonnull final Codec<Component<ECS_TYPE>> codec) {
        final ExtraInfo extraInfo = ExtraInfo.THREAD_LOCAL.get();
        final BsonValue bsonValue = codec.encode(component, extraInfo);
        extraInfo.getValidationResults().logOrThrowValidatorExceptions(UnknownComponents.LOGGER);
        this.unknownComponents.put(componentId, bsonValue.asDocument());
    }
    
    public void addComponent(@Nonnull final String componentId, @Nonnull final TempUnknownComponent<ECS_TYPE> component) {
        this.unknownComponents.put(componentId, component.getDocument());
    }
    
    public boolean contains(@Nonnull final String componentId) {
        return this.unknownComponents.containsKey(componentId);
    }
    
    @Nullable
    public <T extends Component<ECS_TYPE>> T removeComponent(@Nonnull final String componentId, @Nonnull final Codec<T> codec) {
        final BsonDocument bsonDocument = this.unknownComponents.remove(componentId);
        if (bsonDocument == null) {
            return null;
        }
        final ExtraInfo extraInfo = ExtraInfo.THREAD_LOCAL.get();
        final T component = codec.decode(bsonDocument, extraInfo);
        extraInfo.getValidationResults().logOrThrowValidatorExceptions(UnknownComponents.LOGGER);
        return component;
    }
    
    @Nonnull
    public Map<String, BsonDocument> getUnknownComponents() {
        return this.unknownComponents;
    }
    
    @Nonnull
    @Override
    public Component<ECS_TYPE> clone() {
        return new UnknownComponents(new Object2ObjectOpenHashMap<String, BsonDocument>(this.unknownComponents));
    }
    
    static {
        LOGGER = HytaleLogger.forEnclosingClass();
        CODEC = BuilderCodec.builder(UnknownComponents.class, UnknownComponents::new).addField(new KeyedCodec<Map>("Components", (Codec<Map>)new MapCodec((Codec<Object>)Codec.BSON_DOCUMENT, (Supplier<Map>)Object2ObjectOpenHashMap::new, false)), (o, map) -> o.unknownComponents = map, o -> o.unknownComponents).build();
    }
}
