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

package com.hypixel.hytale.server.npc.blackboard.view.interaction;

import com.hypixel.hytale.server.npc.blackboard.view.IBlackboardView;
import com.hypixel.hytale.server.npc.blackboard.Blackboard;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.component.Store;
import javax.annotation.Nonnull;
import java.util.UUID;
import com.hypixel.hytale.server.core.entity.UUIDComponent;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.npc.entities.NPCEntity;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.npc.blackboard.view.PrioritisedProviderView;

public class InteractionView extends PrioritisedProviderView<ReservationProvider, InteractionView>
{
    private final World world;
    static final /* synthetic */ boolean $assertionsDisabled;
    
    public InteractionView(final World world) {
        this.world = world;
        ((PrioritisedProviderView<ReservationProvider, ViewType>)this).registerProvider(Integer.MAX_VALUE, (npcRef, playerRef, componentAccessor) -> {
            final NPCEntity npcComponent = componentAccessor.getComponent(npcRef, NPCEntity.getComponentType());
            if (!InteractionView.$assertionsDisabled && npcComponent == null) {
                throw new AssertionError();
            }
            else if (!npcComponent.isReserved()) {
                return ReservationStatus.NOT_RESERVED;
            }
            else {
                final UUIDComponent playerUUIDComponent = componentAccessor.getComponent(playerRef, UUIDComponent.getComponentType());
                if (!InteractionView.$assertionsDisabled && playerUUIDComponent == null) {
                    throw new AssertionError();
                }
                else {
                    final UUID playerUUID = playerUUIDComponent.getUuid();
                    return npcComponent.isReservedBy(playerUUID) ? ReservationStatus.RESERVED_THIS : ReservationStatus.RESERVED_OTHER;
                }
            }
        });
    }
    
    @Override
    public boolean isOutdated(@Nonnull final Ref<EntityStore> ref, @Nonnull final Store<EntityStore> store) {
        return false;
    }
    
    @Override
    public InteractionView getUpdatedView(@Nonnull final Ref<EntityStore> ref, @Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        final World entityWorld = componentAccessor.getExternalData().getWorld();
        if (!entityWorld.equals(this.world)) {
            final Blackboard blackboardResource = componentAccessor.getResource(Blackboard.getResourceType());
            return blackboardResource.getView(InteractionView.class, ref, componentAccessor);
        }
        return this;
    }
    
    @Override
    public void initialiseEntity(@Nonnull final Ref<EntityStore> ref, @Nonnull final NPCEntity npcComponent) {
    }
    
    @Override
    public void cleanup() {
    }
    
    @Override
    public void onWorldRemoved() {
    }
    
    @Nonnull
    public ReservationStatus getReservationStatus(@Nonnull final Ref<EntityStore> npcRef, @Nonnull final Ref<EntityStore> playerRef, @Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        for (int i = 0; i < this.providers.size(); ++i) {
            final ReservationStatus status = ((ReservationProvider)this.providers.get(i).getProvider()).getReservationStatus(npcRef, playerRef, componentAccessor);
            if (status != ReservationStatus.NOT_RESERVED) {
                return status;
            }
        }
        return ReservationStatus.NOT_RESERVED;
    }
}
