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

package com.hypixel.hytale.server.npc.sensorinfo;

import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.ComponentAccessor;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.npc.sensorinfo.parameterproviders.ParameterProvider;

public class PositionProvider extends InfoProviderBase implements IPositionProvider
{
    protected double x;
    protected double y;
    protected double z;
    protected boolean isValid;
    
    public PositionProvider() {
        this.x = 2.147483647E9;
        this.y = 2.147483647E9;
        this.z = 2.147483647E9;
    }
    
    public PositionProvider(final ParameterProvider parameterProvider) {
        super(parameterProvider);
        this.x = 2.147483647E9;
        this.y = 2.147483647E9;
        this.z = 2.147483647E9;
    }
    
    public PositionProvider(final ParameterProvider parameterProvider, final ExtraInfoProvider... providers) {
        super(parameterProvider, providers);
        this.x = 2.147483647E9;
        this.y = 2.147483647E9;
        this.z = 2.147483647E9;
    }
    
    @Override
    public void clear() {
        this.x = 2.147483647E9;
        this.y = 2.147483647E9;
        this.z = 2.147483647E9;
        this.isValid = false;
    }
    
    @Nullable
    public Ref<EntityStore> setTarget(@Nullable final Ref<EntityStore> ref, @Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        if (ref == null) {
            return null;
        }
        if (!ref.isValid() || componentAccessor.getArchetype(ref).contains(DeathComponent.getComponentType())) {
            this.clear();
            return null;
        }
        final TransformComponent transformComponent = componentAccessor.getComponent(ref, TransformComponent.getComponentType());
        assert transformComponent != null;
        this.setTarget(transformComponent.getPosition());
        return ref;
    }
    
    public void setTarget(@Nonnull final Vector3d pos) {
        this.setTarget(pos.x, pos.y, pos.z);
    }
    
    public void setTarget(final double x, final double y, final double z) {
        this.x = x;
        this.y = y;
        this.z = z;
        this.isValid = true;
    }
    
    @Override
    public boolean providePosition(@Nonnull final Vector3d result) {
        if (!this.hasPosition()) {
            return false;
        }
        result.assign(this.x, this.y, this.z);
        return true;
    }
    
    @Override
    public double getX() {
        return this.x;
    }
    
    @Override
    public double getY() {
        return this.y;
    }
    
    @Override
    public double getZ() {
        return this.z;
    }
    
    @Nonnull
    @Override
    public IPositionProvider getPositionProvider() {
        return this;
    }
    
    @Override
    public boolean hasPosition() {
        return this.isValid;
    }
    
    @Nullable
    @Override
    public Ref<EntityStore> getTarget() {
        return null;
    }
}
