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

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

import com.hypixel.hytale.server.npc.blackboard.view.IBlackboardView;
import com.hypixel.hytale.server.npc.entities.NPCEntity;
import com.hypixel.hytale.server.npc.blackboard.Blackboard;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.asset.type.attitude.Attitude;
import com.hypixel.hytale.server.npc.role.Role;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.role.support.WorldSupport;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.npc.NPCPlugin;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.npc.blackboard.view.PrioritisedProviderView;

public class AttitudeView extends PrioritisedProviderView<IAttitudeProvider, AttitudeView>
{
    private final World world;
    
    public AttitudeView(final World world) {
        this.world = world;
        ((PrioritisedProviderView<IAttitudeProvider, ViewType>)this).registerProvider(0, (ref, self, target, accessor) -> self.getWorldSupport().getOverriddenAttitude(target));
        ((PrioritisedProviderView<IAttitudeProvider, ViewType>)this).registerProvider(200, (ref, self, target, accessor) -> NPCPlugin.get().getAttitudeMap().getAttitude(self, target, accessor));
        ((PrioritisedProviderView<IAttitudeProvider, ViewType>)this).registerProvider(Integer.MAX_VALUE, (ref, self, target, accessor) -> {
            final WorldSupport worldSupport = self.getWorldSupport();
            if (accessor.getArchetype(target).contains(Player.getComponentType())) {
                return worldSupport.getDefaultPlayerAttitude();
            }
            else {
                return worldSupport.getDefaultNPCAttitude();
            }
        });
    }
    
    @Nonnull
    public Attitude getAttitude(@Nonnull final Ref<EntityStore> ref, @Nonnull final Role self, @Nonnull final Ref<EntityStore> target, @Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        Attitude result = null;
        for (int pos = 0; result == null; result = ((PrioritisedProvider<IAttitudeProvider>)this.providers.get(pos++)).getProvider().getAttitude(ref, self, target, componentAccessor)) {
            if (pos >= this.providers.size()) {
                return Attitude.NEUTRAL;
            }
        }
        return result;
    }
    
    @Override
    public boolean isOutdated(@Nonnull final Ref<EntityStore> ref, @Nonnull final Store<EntityStore> store) {
        return false;
    }
    
    @Override
    public AttitudeView 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(AttitudeView.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() {
    }
}
