import { world, system, Entity } from '@minecraft/server';

// Список всех сущностей, для которых нужно отслеживать падение
const ENTITY_IDENTIFIERS = [
    "mebesm:huggy_wuggy",
    "mebesm:kissy_missy",
    "mebesm:kissy_missy_wounded",
    "mebesm:huggy_wuggy_wounded"
];

// Названия анимаций (общие для всех мобов)
const FALLING_ANIMATION = "animation.huggy_wuggy.falling_loop"; // Используется "huggy_wuggy" как общий префикс
const IDLE_ANIMATION = "animation.huggy_wuggy.idle";

// 15 тиков = 0.75 секунды задержки
const FALL_DELAY_TICKS = 15;

// Карта для отслеживания состояния: 
// Ключ: entity.id, Значение: { startTime: number, isPlaying: boolean }
const fallingTracker = new Map();

/**
 * Управляет анимациями падения и покоя для конкретной сущности.
 * @param {Entity} entity Сущность для проверки.
 */
function manageFallingAnimation(entity) {
    // Получаем трекер или создаем новый
    const tracker = fallingTracker.get(entity.id) || { startTime: 0, isPlaying: false };

    // Получаем текущее состояние
    const velocity = entity.getVelocity();
    const onGround = entity.isOnGround;

    // Критерий для начала отсчета "падения": моб движется вниз со значительной скоростью И не на земле.
    const isFallingConditionMet = velocity.y < -0.05 && !onGround;

    if (isFallingConditionMet) {
        // --- СТАРТ ПАДЕНИЯ И ОТСЧЕТ ТАЙМЕРА ---

        // Если только начали падать и не начали отсчет
        if (tracker.startTime === 0) {
            tracker.startTime = system.currentTick;
        }

        const elapsedTicks = system.currentTick - tracker.startTime;

        // Если задержка прошла И анимация еще не запущена
        if (elapsedTicks >= FALL_DELAY_TICKS && !tracker.isPlaying) {

            // ЗАПУСК АНИМАЦИИ ПАДЕНИЯ
            entity.playAnimation(FALLING_ANIMATION, {
                blendOutTime: 0.1,
                loop: true,
            });
            tracker.isPlaying = true;
        }

    } else {
        // --- ПРЕКРАЩЕНИЕ ПАДЕНИЯ (Моб на земле, летит вверх и т.д.) ---

        // Сброс таймера
        tracker.startTime = 0;

        // Если анимация падения проигрывалась, нужно ее остановить
        if (tracker.isPlaying) {

            // ОСТАНОВКА АНИМАЦИИ ПУТЕМ ЗАПУСКА АНИМАЦИИ ПОКОЯ
            entity.playAnimation(IDLE_ANIMATION, {
                // Вы используете 0.5s для плавного перехода, что хорошо имитирует приземление
                blendOutTime: 10, // 0.5s = 10 тиков. Лучше использовать тики.
                loop: true
            });

            tracker.isPlaying = false;
        }
    }

    // Обновляем состояние в карте
    fallingTracker.set(entity.id, tracker);
}

// Запускаем проверку каждые 2 тика (10 раз в секунду)
system.runInterval(() => {
    try {
        const dimension = world.getDimension("overworld");

        // Перебираем все указанные типы сущностей
        for (const entityType of ENTITY_IDENTIFIERS) {
            // Используем getEntities с фильтром по типу
            for (const entity of dimension.getEntities({ type: entityType })) {
                manageFallingAnimation(entity);
            }
        }

        // Очистка карты от удаленных сущностей 
        for (const [id] of fallingTracker.entries()) {
            if (!world.getEntity(id)) {
                fallingTracker.delete(id);
            }
        }

    } catch (e) {
        // Вывод ошибок в консоль
        console.error(`Ошибка в цикле отслеживания анимаций: ${e}`);
    }
}, 2);