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

package com.hypixel.hytale.builtin.instances.blocks;

import com.hypixel.hytale.component.query.Query;
import com.hypixel.hytale.component.RemoveReason;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.component.AddReason;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.system.RefSystem;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.Codec;
import javax.annotation.Nullable;
import com.hypixel.hytale.builtin.instances.InstancesPlugin;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.server.core.universe.world.World;
import java.util.concurrent.CompletableFuture;
import java.util.UUID;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import com.hypixel.hytale.component.Component;

public class InstanceBlock implements Component<ChunkStore>
{
    public static final BuilderCodec<InstanceBlock> CODEC;
    protected UUID worldUUID;
    protected CompletableFuture<World> worldFuture;
    protected boolean closeOnRemove;
    
    public static ComponentType<ChunkStore, InstanceBlock> getComponentType() {
        return InstancesPlugin.get().getInstanceBlockComponentType();
    }
    
    public InstanceBlock() {
        this.closeOnRemove = true;
    }
    
    public InstanceBlock(final UUID worldUUID, final boolean closeOnRemove) {
        this.closeOnRemove = true;
        this.worldUUID = worldUUID;
        this.closeOnRemove = closeOnRemove;
    }
    
    public UUID getWorldUUID() {
        return this.worldUUID;
    }
    
    public void setWorldUUID(final UUID worldUUID) {
        this.worldUUID = worldUUID;
    }
    
    public CompletableFuture<World> getWorldFuture() {
        return this.worldFuture;
    }
    
    public void setWorldFuture(final CompletableFuture<World> worldFuture) {
        this.worldFuture = worldFuture;
    }
    
    public boolean isCloseOnRemove() {
        return this.closeOnRemove;
    }
    
    public void setCloseOnRemove(final boolean closeOnRemove) {
        this.closeOnRemove = closeOnRemove;
    }
    
    @Nullable
    @Override
    public Component<ChunkStore> clone() {
        return new InstanceBlock(this.worldUUID, this.closeOnRemove);
    }
    
    static {
        CODEC = BuilderCodec.builder(InstanceBlock.class, InstanceBlock::new).appendInherited(new KeyedCodec<UUID>("WorldName", Codec.UUID_BINARY), (o, i) -> o.worldUUID = i, o -> o.worldUUID, (o, p) -> o.worldUUID = p.worldUUID).add().appendInherited(new KeyedCodec("CloseOnBlockRemove", Codec.BOOLEAN), (o, i) -> o.closeOnRemove = i, o -> o.closeOnRemove, (o, p) -> o.closeOnRemove = p.closeOnRemove).add().build();
    }
    
    public static class OnRemove extends RefSystem<ChunkStore>
    {
        @Override
        public void onEntityAdded(@Nonnull final Ref<ChunkStore> ref, @Nonnull final AddReason reason, @Nonnull final Store<ChunkStore> store, @Nonnull final CommandBuffer<ChunkStore> commandBuffer) {
        }
        
        @Override
        public void onEntityRemove(@Nonnull final Ref<ChunkStore> ref, @Nonnull final RemoveReason reason, @Nonnull final Store<ChunkStore> store, @Nonnull final CommandBuffer<ChunkStore> commandBuffer) {
            final InstanceBlock instance = commandBuffer.getComponent(ref, InstanceBlock.getComponentType());
            assert instance != null;
            if (!instance.closeOnRemove) {
                return;
            }
            if (instance.worldUUID != null) {
                InstancesPlugin.get();
                InstancesPlugin.safeRemoveInstance(instance.worldUUID);
            }
            else if (instance.worldFuture != null) {
                instance.worldFuture.thenAccept(world -> {
                    InstancesPlugin.get();
                    InstancesPlugin.safeRemoveInstance(world.getName());
                });
            }
        }
        
        @Nullable
        @Override
        public Query<ChunkStore> getQuery() {
            return InstanceBlock.getComponentType();
        }
    }
}
