package com.tiedup.remake.client.animation;

import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

/**
 * Client-side animation state tracking + world-unload cleanup facade.
 *
 * <p>Holds {@link #lastTiedState} (the per-player edge-detector used by
 * {@link com.tiedup.remake.client.animation.tick.AnimationTickHandler} to
 * spot the "just untied" transition) and chains cleanup via
 * {@link #clearAll()} across every animation-related cache on world unload.</p>
 */
@OnlyIn(Dist.CLIENT)
public final class AnimationStateRegistry {

    /** Track last tied state per player (edge-detect on untie transition). */
    static final Map<UUID, Boolean> lastTiedState = new ConcurrentHashMap<>();

    private AnimationStateRegistry() {}

    public static Map<UUID, Boolean> getLastTiedState() {
        return lastTiedState;
    }

    /**
     * Clear all animation-related state in one call.
     * Called on world unload to prevent memory leaks and stale data.
     */
    public static void clearAll() {
        // Animation state tracking
        lastTiedState.clear();

        // Animation managers
        BondageAnimationManager.clearAll();
        PendingAnimationManager.clearAll();

        // V2 animation context system (clearAll chains to ContextAnimationFactory.clearCache)
        com.tiedup.remake.client.gltf.GltfAnimationApplier.clearAll();

        // Render state
        com.tiedup.remake.client.animation.render.DogPoseRenderHandler.clearState();
        com.tiedup.remake.client.animation.render.PetBedRenderHandler.clearAll();
        com.tiedup.remake.client.animation.render.HeldItemHideHandler.clearAll();
        com.tiedup.remake.client.animation.render.PlayerArmHideEventHandler.clearAll();

        // NPC animation state
        com.tiedup.remake.client.animation.tick.NpcAnimationTickHandler.clearAll();

        // MCA animation cache
        com.tiedup.remake.client.animation.tick.MCAAnimationTickCache.clear();
    }
}
