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

package com.hypixel.hytale.server.core.modules.entity.item;

import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
import com.hypixel.hytale.component.RemoveReason;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.component.query.Query;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.system.tick.EntityTickingSystem;

public class PickupItemSystem extends EntityTickingSystem<EntityStore>
{
    private static final float EYE_HEIGHT_SCALE = 5.0f;
    @Nonnull
    private final ComponentType<EntityStore, PickupItemComponent> pickupItemComponentType;
    @Nonnull
    private final ComponentType<EntityStore, TransformComponent> transformComponentType;
    @Nonnull
    private final Query<EntityStore> query;
    
    public PickupItemSystem(@Nonnull final ComponentType<EntityStore, PickupItemComponent> pickupItemComponentType, @Nonnull final ComponentType<EntityStore, TransformComponent> transformComponentType) {
        this.pickupItemComponentType = pickupItemComponentType;
        this.transformComponentType = transformComponentType;
        this.query = (Query<EntityStore>)Query.and(pickupItemComponentType, transformComponentType);
    }
    
    @Override
    public void tick(final float dt, final int index, @Nonnull final ArchetypeChunk<EntityStore> archetypeChunk, @Nonnull final Store<EntityStore> store, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        final PickupItemComponent pickupItemComponent = archetypeChunk.getComponent(index, this.pickupItemComponentType);
        assert pickupItemComponent != null;
        if (pickupItemComponent.hasFinished()) {
            commandBuffer.removeEntity(archetypeChunk.getReferenceTo(index), RemoveReason.REMOVE);
            return;
        }
        final Ref<EntityStore> targetRef = pickupItemComponent.getTargetRef();
        if (targetRef == null || !targetRef.isValid()) {
            commandBuffer.removeEntity(archetypeChunk.getReferenceTo(index), RemoveReason.REMOVE);
            return;
        }
        final TransformComponent transformComponent = archetypeChunk.getComponent(index, this.transformComponentType);
        assert transformComponent != null;
        final Vector3d position = transformComponent.getPosition();
        final TransformComponent targetTransformComponent = commandBuffer.getComponent(targetRef, this.transformComponentType);
        if (targetTransformComponent == null) {
            return;
        }
        final Vector3d targetPosition = targetTransformComponent.getPosition().clone();
        final ModelComponent targetModelComponent = commandBuffer.getComponent(targetRef, ModelComponent.getComponentType());
        if (targetModelComponent != null) {
            final float targetModelEyeHeight = targetModelComponent.getModel().getEyeHeight(targetRef, commandBuffer);
            targetPosition.add(0.0, targetModelEyeHeight / 5.0f, 0.0);
        }
        if (updateMovement(pickupItemComponent, position, targetPosition, dt)) {
            pickupItemComponent.setFinished(true);
        }
    }
    
    private static boolean updateMovement(@Nonnull final PickupItemComponent pickupItemComponent, @Nonnull final Vector3d current, @Nonnull final Vector3d target, final float dt) {
        final float remainingTime = pickupItemComponent.getLifeTime();
        final float originalLifeTime = pickupItemComponent.getOriginalLifeTime();
        final float progress = 1.0f - remainingTime / originalLifeTime;
        if (progress >= 1.0f) {
            current.assign(target);
            return true;
        }
        current.assign(Vector3d.lerp(pickupItemComponent.getStartPosition(), target, progress));
        pickupItemComponent.decreaseLifetime(dt);
        return false;
    }
    
    @Nonnull
    @Override
    public Query<EntityStore> getQuery() {
        return this.query;
    }
}
