package electrosphere.game.data.creature.type;

import electrosphere.game.data.collidable.CollidableTemplate;
import electrosphere.game.data.collidable.HitboxData;
import electrosphere.game.data.creature.type.ai.AITreeData;
import electrosphere.game.data.creature.type.attack.AttackMove;
import electrosphere.game.data.creature.type.attack.AttackMoveResolver;
import electrosphere.game.data.creature.type.block.BlockSystem;
import electrosphere.game.data.creature.type.bonegroups.BoneGroup;
import electrosphere.game.data.creature.type.equip.EquipPoint;
import electrosphere.game.data.creature.type.movement.MovementSystem;
import electrosphere.game.data.creature.type.rotator.RotatorSystem;
import electrosphere.game.data.creature.type.visualattribute.VisualAttribute;

import java.util.List;

/**
 * A given type of creature
 */
public class CreatureData {

    /**
     * The id of the creature
     */
    String creatureId;
    
    /**
     * The list of hitboxes on the creature
     */
    List<HitboxData> hitboxes;
    
    /**
     * Various tokens
     */
    List<String> tokens;

    /**
     * The visual attributes that can be configured on this creature type
     */
    List<VisualAttribute> visualAttributes;

    /**
     * The movement systems available to this creature type
     */
    List<MovementSystem> movementSystems;

    /**
     * Rotator systems available to this creature type
     */
    RotatorSystem rotatorSystem;
    
    /**
     * The list of equip points on this creature
     */
    List<EquipPoint> equipPoints;

    /**
     * The collidable used for this creature type
     */
    CollidableTemplate collidable;

    /**
     * The list of attack moves available to this creature
     */
    List<AttackMove> attackMoves;

    /**
     * The health system available to this creature
     */
    HealthSystem healthSystem;

    /**
     * The look at system available for this creature
     */
    LookAtSystem lookAtSystem;

    /**
     * The model path for this creature
     */
    String modelPath;

    /**
     * The view model data for this creature
     */
    ViewModelData viewModelData;

    /**
     * The idle data for this creature
     */
    IdleData idleData;

    /**
     * The block system for this creature
     */
    BlockSystem blockSystem;

    /**
     * The configuration data for the ai trees associated with this creature
     */
    List<AITreeData> aiTrees;

    /**
     * The attack move resolver for this creature type
     */
    AttackMoveResolver attackMoveResolver;

    /**
     * The list of bone groups for this creature
     */
    List<BoneGroup> boneGroups;

    /**
     * Gets the id for this creature type
     * @return The id
     */
    public String getCreatureId() {
        return creatureId;
    }

    /**
     * Gets the list of hitboxes for this creature
     * @return The list of hitbox data
     */
    public List<HitboxData> getHitboxes() {
        return hitboxes;
    }

    /**
     * Gets the tokens for this creature
     * @return The tokens
     */
    public List<String> getTokens() {
        return tokens;
    }

    /**
     * Gets the configurable visual attributes for this creature type
     * @return The list of visual attribute data
     */
    public List<VisualAttribute> getVisualAttributes(){
        return visualAttributes;
    }

    /**
     * Gets the path for the model for this creature
     * @return The model path
     */
    public String getModelPath() {
        return modelPath;
    }

    /**
     * Gets the list of data of movement types available to this creature
     * @return The list of movement type data
     */
    public List<MovementSystem> getMovementSystems() {
        return movementSystems;
    }

    /**
     * Gets the list of attack moves available to this creature type
     * @return The list of attack moves
     */
    public List<AttackMove> getAttackMoves() {
        return attackMoves;
    }

    /**
     * Gets the health system data for this creature type
     * @return The health system data
     */
    public HealthSystem getHealthSystem() {
        return healthSystem;
    }

    /**
     * Gets the collidable data for this creature type
     * @return The collidable data
     */
    public CollidableTemplate getCollidable() {
        return collidable;
    }

    /**
     * Gets the look at system configuration for this creature type
     * @return The look at system data
     */
    public LookAtSystem getLookAtSystem() {
        return lookAtSystem;
    }
    
    /**
     * Gets the rotator data for this creature type
     * @return The rotator data
     */
    public RotatorSystem getRotatorSystem() {
        return rotatorSystem;
    }

    /**
     * Gets the list of equip points for this creature type
     * @return The list of equip points
     */
    public List<EquipPoint> getEquipPoints(){
        return equipPoints;
    }

    /**
     * Sets the attack move resolver for this creature type
     * @param resolver The resolver
     */
    public void setAttackMoveResolver(AttackMoveResolver resolver){
        attackMoveResolver = resolver;
    }

    /**
     * Gets the attack move resolver for this creature type
     * @return The attack move resolver
     */
    public AttackMoveResolver getAttackMoveResolver(){
        return attackMoveResolver;
    }

    /**
     * Gets the first-person view model data for this creature type
     * @return The first-person view model data
     */
    public ViewModelData getViewModelData(){
        return viewModelData;
    }

    /**
     * Gets the idle data for this creature type (ie animation data)
     * @return The idle data
     */
    public IdleData getIdleData(){
        return idleData;
    }

    /**
     * Gets the block system data for this creature type
     * @return The block system data
     */
    public BlockSystem getBlockSystem(){
        return blockSystem;
     }

    /**
     * Gets the AI tree data associated with this creature type
     * @return The list of ai tree data
     */
    public List<AITreeData> getAITrees(){
        return aiTrees;
    }

    /**
     * Gets the list of bone groups for this creature
     * @return The list of bone groups
     */
    public List<BoneGroup> getBoneGroups(){
        return boneGroups;
    }
    
    
}
