package ilargia.egdx.logicbricks.system.sensor;


import com.badlogic.gdx.physics.box2d.Fixture;
import ilargia.egdx.api.Engine;
import ilargia.egdx.api.managers.listener.Collision;
import ilargia.egdx.impl.managers.PhysicsManagerGDX;
import ilargia.egdx.logicbricks.component.sensor.RadarSensor;
import ilargia.egdx.logicbricks.gen.Entitas;
import ilargia.egdx.logicbricks.gen.game.GameEntity;
import ilargia.egdx.logicbricks.gen.sensor.SensorContext;
import ilargia.egdx.logicbricks.gen.sensor.SensorEntity;
import ilargia.egdx.logicbricks.gen.sensor.SensorMatcher;
import ilargia.egdx.logicbricks.index.Indexed;
import ilargia.entitas.api.system.IInitializeSystem;
import ilargia.entitas.group.Group;
import ilargia.entitas.matcher.Matcher;

public class RadarSensorSystem extends SensorSystem implements Collision<Fixture>, IInitializeSystem {
    private final SensorContext sensorContex;
    private final Group<SensorEntity> sensorGroup;
    private final Engine engine;


    public RadarSensorSystem(Entitas entitas, Engine engine) {
        this.sensorContex = entitas.sensor;
        this.engine = engine;
        this.sensorGroup = sensorContex.getGroup(Matcher.AllOf(SensorMatcher.RadarSensor(), SensorMatcher.Link()));

    }

    @Override
    public void initialize() {
        engine.getManager(PhysicsManagerGDX.class).addListener(this);
    }

    @Override
    protected boolean query(SensorEntity sensorEntity, float deltaTime) {
        return sensorEntity.getRadarSensor().collisionSignal;

    }

    @Override
    public void execute(float deltaTime) {
        for (SensorEntity sensorEntity : sensorGroup.getEntities()) {
            process(sensorEntity, deltaTime);
        }
    }

    @Override
    public void processCollision(Fixture colliderA, Fixture colliderB, boolean collisionSignal) {
        if (colliderA.isSensor() && !colliderB.isSensor()) {
            Integer indexEntityA = (Integer) colliderA.getBody().getUserData();
            Integer indexEntityB = (Integer) colliderB.getBody().getUserData();
            String tagSensorA = (String) colliderA.getUserData();

            if (indexEntityA != null && indexEntityB != null && tagSensorA != null && tagSensorA.equals("RadarSensor")) {
                GameEntity entityB = Indexed.getInteractiveEntity(indexEntityB);
                if (entityB != null) {
                    for (SensorEntity entity : sensorGroup.getEntities()) {
                        RadarSensor radar = entity.getRadarSensor();
                        if (entityB.getTags().values.contains(radar.targetTag)) {
                            if (collisionSignal) {
                                Indexed.addEntityInSensor(entity, entityB);
                            } else {
                                Indexed.removeEntityInSensor(entity, entityB);
                            }
                            radar.collisionSignal = collisionSignal;
                        }

                    }
                }
            }
        }
    }
}