package com.tiedup.remake.entities.damsel.components;

import com.tiedup.remake.personality.PersonalityState;
import java.util.UUID;
import net.minecraft.core.BlockPos;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;

/**
 * Interface for EntityDamsel to provide callbacks to DamselBondageManager.
 * This prevents circular dependencies while allowing the bondage component
 * to access necessary host entity functionality.
 *
 */
public interface IBondageHost {
    /**
     * Get the personality state for conditioning/training logic.
     * @return personality state instance
     */
    PersonalityState getPersonalityState();

    /**
     * Get the inventory manager for equipment access.
     * @return inventory manager instance
     */
    com.tiedup.remake.entities.damsel.components.DamselInventoryManager getInventory();

    /**
     * Drop an item stack at this entity's location.
     * @param stack item to drop
     */
    void dropItemStack(ItemStack stack);

    /**
     * Play a sound at this entity's location.
     * @param sound sound event to play
     */
    void playSound(SoundEvent sound);

    /**
     * Set the entity's health.
     * @param health new health value
     */
    void setHealth(float health);

    /**
     * Remove this entity from the world.
     * @param reason removal reason
     */
    void remove(Entity.RemovalReason reason);

    /**
     * Get the level this entity is in.
     * @return level instance
     */
    Level level();

    /**
     * Get the block position of this entity.
     * @return block position
     */
    BlockPos blockPosition();

    /**
     * Get the UUID of this entity.
     * @return entity UUID
     */
    UUID getUUID();

    /**
     * Get the damsel's name for logging.
     * @return damsel name
     */
    String getNpcName();

    /**
     * Broadcast dialogue to nearby players.
     * @param category dialogue category
     * @param radius search radius
     */
    void talkToPlayersInRadius(
        com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory category,
        int radius
    );
}
