package me.sucixr.kitin.network.misc;

import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.vehicle.AbstractBoat;
import net.minecraft.world.entity.vehicle.AbstractMinecart;

public final class EntitySyncPolicy {

    private static final EntitySyncPolicy INSTANCE = new EntitySyncPolicy();
    public static EntitySyncPolicy getInstance() { return INSTANCE; }

    // 每隔多少 tick 才允许“硬碰撞强制 PositionSync”触发一次（20 = 1 秒一次）
    private static final int HARD_COLLISION_SYNC_INTERVAL_TICKS = 20;

    /**
     * Paper/Moonrise 会在硬碰撞时把 teleportDelay 拉到 9999，导致每 tick 走 PositionSync。
     * 这里把它“限流”，避免 boat/minecart 在农场里刷爆带宽。
     *
     * @return 要写回 ServerEntity.teleportDelay 的值
     */
    public int adjustTeleportDelayForHardCollision(final Entity entity,
                                                   final int tickCount,
                                                   final int currentTeleportDelay) {

        boolean isVehicle = false;
        if (me.sucixr.kitin.config.KitinConfig.optimizeAllMinecarts && entity instanceof AbstractMinecart) {
            isVehicle = true;
        } else if (me.sucixr.kitin.config.KitinConfig.optimizeAllBoats && entity instanceof AbstractBoat) {
            isVehicle = true;
        } else if (me.sucixr.kitin.config.KitinConfig.optimizedSyncEntities.contains(entity.getType())) {
            isVehicle = true;
        }

        if (!isVehicle) {
            return 9999;
        }

        // 有玩家乘坐时不限流，避免骑乘抖动
        if (!entity.getPassengers().isEmpty()) {
            return 9999;
        }

        // 几乎不动的载具（挤在农场/停在终点）：保持原 teleportDelay，自然计数到 400 才发一次
        if (entity.getDeltaMovement().lengthSqr() < 0.0025) {
            return currentTeleportDelay;
        }

        // 空载具运动中：每 N tick 才触发一次强制 PositionSync（返回 401 满足 teleportDelay > 400）
        if ((tickCount % HARD_COLLISION_SYNC_INTERVAL_TICKS) == 0) {
            return 401;
        }

        // 其它 tick 压回 0，避免走 PositionSync
        return 0;
    }
}
