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

package com.hypixel.hytale.server.npc.corecomponents.utility;

import com.hypixel.hytale.server.npc.util.IAnnotatedComponent;
import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.npc.movement.controllers.MotionController;
import com.hypixel.hytale.server.npc.entities.NPCEntity;
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.role.Role;
import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderSensorBase;
import java.util.List;
import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorMany;
import com.hypixel.hytale.server.npc.sensorinfo.WrappedInfoProvider;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.instructions.Sensor;
import com.hypixel.hytale.server.npc.util.IAnnotatedComponentCollection;
import com.hypixel.hytale.server.npc.corecomponents.SensorBase;

public abstract class SensorMany extends SensorBase implements IAnnotatedComponentCollection
{
    @Nonnull
    protected final Sensor[] sensors;
    protected final int autoUnlockTargetSlot;
    protected final WrappedInfoProvider infoProvider;
    
    public SensorMany(@Nonnull final BuilderSensorMany builder, @Nonnull final BuilderSupport support, @Nonnull final List<Sensor> sensors) {
        super(builder);
        if (sensors == null) {
            throw new IllegalArgumentException("Sensor list can't be null");
        }
        this.sensors = sensors.toArray(Sensor[]::new);
        for (final Sensor sensor : this.sensors) {
            if (sensor == null) {
                throw new IllegalArgumentException("Sensor in sensor list can't be null");
            }
        }
        this.autoUnlockTargetSlot = builder.getAutoUnlockedTargetSlot(support);
        this.infoProvider = this.createInfoProvider();
    }
    
    @Override
    public void done() {
        for (final Sensor s : this.sensors) {
            s.done();
        }
    }
    
    @Override
    public void registerWithSupport(final Role role) {
        for (final Sensor sensor : this.sensors) {
            sensor.registerWithSupport(role);
        }
    }
    
    @Override
    public void motionControllerChanged(@Nullable final Ref<EntityStore> ref, @Nonnull final NPCEntity npcComponent, final MotionController motionController, @Nullable final ComponentAccessor<EntityStore> componentAccessor) {
        for (final Sensor sensor : this.sensors) {
            sensor.motionControllerChanged(ref, npcComponent, motionController, componentAccessor);
        }
    }
    
    @Override
    public void loaded(final Role role) {
        for (final Sensor sensor : this.sensors) {
            sensor.loaded(role);
        }
    }
    
    @Override
    public void spawned(final Role role) {
        for (final Sensor sensor : this.sensors) {
            sensor.spawned(role);
        }
    }
    
    @Override
    public void unloaded(final Role role) {
        for (final Sensor sensor : this.sensors) {
            sensor.unloaded(role);
        }
    }
    
    @Override
    public void removed(final Role role) {
        for (final Sensor sensor : this.sensors) {
            sensor.removed(role);
        }
    }
    
    @Override
    public void teleported(final Role role, final World from, final World to) {
        for (final Sensor sensor : this.sensors) {
            sensor.teleported(role, from, to);
        }
    }
    
    @Override
    public InfoProvider getSensorInfo() {
        return this.infoProvider;
    }
    
    @Override
    public int componentCount() {
        return this.sensors.length;
    }
    
    @Override
    public IAnnotatedComponent getComponent(final int index) {
        return this.sensors[index];
    }
    
    @Override
    public void setContext(final IAnnotatedComponent parent, final int index) {
        super.setContext(parent, index);
        for (int i = 0; i < this.sensors.length; ++i) {
            this.sensors[i].setContext(this, i);
        }
    }
    
    protected abstract WrappedInfoProvider createInfoProvider();
}
