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

package com.hypixel.hytale.builtin.adventure.memories.component;

import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.Codec;
import java.util.Collections;
import javax.annotation.Nonnull;
import java.util.Collection;
import com.hypixel.hytale.builtin.adventure.memories.MemoriesPlugin;
import com.hypixel.hytale.component.ComponentType;
import java.util.LinkedHashSet;
import com.hypixel.hytale.builtin.adventure.memories.memories.Memory;
import java.util.Set;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Component;

public class PlayerMemories implements Component<EntityStore>
{
    public static final BuilderCodec<PlayerMemories> CODEC;
    private final Set<Memory> memories;
    private int memoriesCapacity;
    
    public PlayerMemories() {
        this.memories = new LinkedHashSet<Memory>();
    }
    
    public static ComponentType<EntityStore, PlayerMemories> getComponentType() {
        return MemoriesPlugin.get().getPlayerMemoriesComponentType();
    }
    
    @Nonnull
    @Override
    public Component<EntityStore> clone() {
        final PlayerMemories playerMemories = new PlayerMemories();
        playerMemories.memories.addAll(this.memories);
        playerMemories.memoriesCapacity = this.memoriesCapacity;
        return playerMemories;
    }
    
    public int getMemoriesCapacity() {
        return this.memoriesCapacity;
    }
    
    public void setMemoriesCapacity(final int memoriesCapacity) {
        this.memoriesCapacity = memoriesCapacity;
    }
    
    public boolean recordMemory(final Memory memory) {
        return this.memories.size() < this.memoriesCapacity && this.memories.add(memory);
    }
    
    public boolean hasMemories() {
        return !this.memories.isEmpty();
    }
    
    public boolean takeMemories(@Nonnull final Set<Memory> outMemories) {
        final boolean result = outMemories.addAll(this.memories);
        this.memories.clear();
        return result;
    }
    
    @Nonnull
    public Set<Memory> getRecordedMemories() {
        return Collections.unmodifiableSet((Set<? extends Memory>)this.memories);
    }
    
    static {
        CODEC = BuilderCodec.builder(PlayerMemories.class, PlayerMemories::new).append(new KeyedCodec<Integer>("Capacity", Codec.INTEGER), (playerMemories, integer) -> playerMemories.memoriesCapacity = integer, playerMemories -> playerMemories.memoriesCapacity).add().append(new KeyedCodec("Memories", new ArrayCodec(Memory.CODEC, Memory[]::new)), (playerMemories, memories) -> {
            if (memories != null) {
                Collections.addAll(playerMemories.memories, memories);
            }
        }, playerMemories -> playerMemories.memories.toArray(Memory[]::new)).add().build();
    }
}
