/*
 * © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
 */

package com.tiedup.remake.v2.bondage.datadriven;

import java.util.Collections;
import java.util.Map;

import net.minecraft.resources.ResourceLocation;

import org.jetbrains.annotations.Nullable;

import com.tiedup.remake.rig.anim.LivingMotion;

/**
 * Bindings animation pour un item bondage data-driven.
 *
 * <p>Porte le mapping {@link LivingMotion} &rarr; {@link ResourceLocation} animation
 * + eventuels one-shots {@code onEquip} / {@code onUnequip}. Consomme par
 * {@code ClientRigEquipmentHandler.rebuildBondageAnimations} (P3-05) pour
 * builder la map {@code livingAnimations} de l'animator quand un item
 * bondage est equipe.
 *
 * <p>Parse via {@code DataDrivenItemParser} (P3-03) depuis JSON :
 * <pre>{@code
 * "animations": {
 *   "living_motions": { "IDLE": "mymod:arms_cuffed_idle", ... },
 *   "on_equip": "mymod:cuffs_equip_oneshot",
 *   "on_unequip": "mymod:cuffs_unequip_oneshot"
 * }
 * }</pre>
 *
 * @param livingMotions  map immutable motion &rarr; anim ID (jamais null, peut etre vide)
 * @param onEquip        optionnel one-shot au moment de l'equipement (null = pas de trigger)
 * @param onUnequip      optionnel one-shot au moment du desequipement (null = pas de trigger)
 */
public record AnimationBindings(
    Map<LivingMotion, ResourceLocation> livingMotions,
    @Nullable ResourceLocation onEquip,
    @Nullable ResourceLocation onUnequip
) {
    /** Shortcut pour bindings totalement vides (equivalent no-op). */
    public static final AnimationBindings EMPTY = new AnimationBindings(Map.of(), null, null);

    /** Constructor canonique : force livingMotions immutable + non-null. */
    public AnimationBindings {
        livingMotions = livingMotions == null ? Collections.emptyMap() : Map.copyOf(livingMotions);
    }

    /** {@code true} si aucun binding n'est defini (ni living motions, ni one-shots). */
    public boolean isEmpty() {
        return livingMotions.isEmpty() && onEquip == null && onUnequip == null;
    }
}
