#ifndef ENTITY_ENUMS_H
#define ENTITY_ENUMS_H

/*************************************************************************/
/*  entity_enums.h                                                       */
/*************************************************************************/
/*                         This file is part of:                         */
/*                          PANDEMONIUM ENGINE                           */
/*             https://github.com/Relintai/pandemonium_engine            */
/*************************************************************************/
/* Copyright (c) 2022-present Péter Magyar.                              */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/

#include "core/object/object.h"
#include "core/string/ustring.h"

class EntityEnums : public Object {
	GDCLASS(EntityEnums, Object);

public:
	static const String BINDING_STRING_ENTITY_PLAYER_TYPES;
	static const String BINDING_STRING_ENTITY_CONTOLLER;
	static const String BINDING_STRING_ENTITY_FLAGS;
	static const String BINDING_STRING_ENTITY_STATE_TYPES;
	static const String BINDING_STRING_COMMON_CHARCATER_SKELETON_POINTS;
	static const String BINDING_STRING_AI_STATES;
	static const String BINDING_STRING_PET_STATES;
	static const String BINDING_STRING_ENTITY_IMMUNITY_FLAGS;
	static const String BINDING_STRING_ENTITY_RELATION_TYPE;
	static const String BINDING_STRING_ENTITY_INTERACTION_TYPE;
	static const String BINDING_STRING_ENTITY_PLAYSTYLE_TYPE;
	static const String BINDING_STRING_ENTITY_WINDOWS;
	static const String BINDING_STRING_ENTITY_ENTITY_RESOURCE_INDICES;

	enum EntityPlayerType {
		ENTITY_PLAYER_TYPE_NONE,
		ENTITY_PLAYER_TYPE_PLAYER,
		ENTITY_PLAYER_TYPE_NETWORKED,
		ENTITY_PLAYER_TYPE_AI,
		ENTITY_PLAYER_TYPE_DISPLAY,
	};

	enum EntityController {
		ENITIY_CONTROLLER_NONE,
		ENITIY_CONTROLLER_PLAYER,
		ENITIY_CONTROLLER_AI
	};

	enum EntityFlags {
		ENITIY_FLAGS_NONE = 0,

		ENTITY_FLAGS_UNTARGETALBE = 1 << 0,
		ENTITY_FLAGS_HIDDEN = 1 << 1,
		ENTITY_FLAGS_INTERACTABLE = 1 << 2,
		ENTITY_FLAGS_HOSTILE = 1 << 3,
	};

	enum EntityStateTypeFlags {
		ENTITY_STATE_TYPE_FLAG_NONE = 0,
		ENTITY_STATE_TYPE_FLAG_STUN = 1 << 0,
		ENTITY_STATE_TYPE_FLAG_ROOT = 1 << 1,
		ENTITY_STATE_TYPE_FLAG_FROZEN = 1 << 2,
		ENTITY_STATE_TYPE_FLAG_SILENCED = 1 << 3,
		ENTITY_STATE_TYPE_FLAG_DISORIENTED = 1 << 4,
		ENTITY_STATE_TYPE_FLAG_FEARED = 1 << 5,
		ENTITY_STATE_TYPE_FLAG_BURNING = 1 << 6,
		ENTITY_STATE_TYPE_FLAG_COLD = 1 << 7,
		ENTITY_STATE_TYPE_FLAG_CURSED = 1 << 8,
		ENTITY_STATE_TYPE_FLAG_PACIFIED = 1 << 9,
	};

	enum EntityStateTypeIndexes {
		ENTITY_STATE_TYPE_INDEX_NONE = 0,
		ENTITY_STATE_TYPE_INDEX_STUN = 1,
		ENTITY_STATE_TYPE_INDEX_ROOT = 2,
		ENTITY_STATE_TYPE_INDEX_FROZEN = 3,
		ENTITY_STATE_TYPE_INDEX_SILENCED = 4,
		ENTITY_STATE_TYPE_INDEX_DISORIENTED = 5,
		ENTITY_STATE_TYPE_INDEX_FEARED = 6,
		ENTITY_STATE_TYPE_INDEX_BURNING = 7,
		ENTITY_STATE_TYPE_INDEX_COLD = 8,
		ENTITY_STATE_TYPE_INDEX_CURSED = 9,
		ENTITY_STATE_TYPE_INDEX_PACIFIED = 10,

		ENTITY_STATE_TYPE_INDEX_MAX = 11,
	};

	static EntityStateTypeFlags get_state_flag_for_index(int index) {
		switch (index) {
			case ENTITY_STATE_TYPE_INDEX_STUN:
				return ENTITY_STATE_TYPE_FLAG_STUN;
			case ENTITY_STATE_TYPE_INDEX_ROOT:
				return ENTITY_STATE_TYPE_FLAG_ROOT;
			case ENTITY_STATE_TYPE_INDEX_FROZEN:
				return ENTITY_STATE_TYPE_FLAG_FROZEN;
			case ENTITY_STATE_TYPE_INDEX_SILENCED:
				return ENTITY_STATE_TYPE_FLAG_SILENCED;
			case ENTITY_STATE_TYPE_INDEX_DISORIENTED:
				return ENTITY_STATE_TYPE_FLAG_DISORIENTED;
			case ENTITY_STATE_TYPE_INDEX_FEARED:
				return ENTITY_STATE_TYPE_FLAG_FEARED;
			case ENTITY_STATE_TYPE_INDEX_BURNING:
				return ENTITY_STATE_TYPE_FLAG_BURNING;
			case ENTITY_STATE_TYPE_INDEX_COLD:
				return ENTITY_STATE_TYPE_FLAG_COLD;
			case ENTITY_STATE_TYPE_INDEX_CURSED:
				return ENTITY_STATE_TYPE_FLAG_CURSED;
			case ENTITY_STATE_TYPE_INDEX_PACIFIED:
				return ENTITY_STATE_TYPE_FLAG_PACIFIED;
		}

		return ENTITY_STATE_TYPE_FLAG_NONE;
	}

	enum EntityImmunityFlags {
		ENTITY_IMMUNITY_FLAG_NONE = 0,

		ENTITY_IMMUNITY_FLAG_STUN = 1 << 0,
		ENTITY_IMMUNITY_FLAG_ROOT = 1 << 1,
		ENTITY_IMMUNITY_FLAG_FREEZE = 1 << 2,
		ENTITY_IMMUNITY_FLAG_SILENCE = 1 << 3,
		ENTITY_IMMUNITY_FLAG_DISORIENT = 1 << 4,
		ENTITY_IMMUNITY_FLAG_FEAR = 1 << 5,
		ENTITY_IMMUNITY_FLAG_BURNING = 1 << 6,
		ENTITY_IMMUNITY_FLAG_COLD = 1 << 7,
		ENTITY_IMMUNITY_FLAG_PACIFY = 1 << 8,

		ENTITY_IMMUNITY_FLAG_MAGIC = 1 << 9,
		ENTITY_IMMUNITY_FLAG_POISON = 1 << 10,
		ENTITY_IMMUNITY_FLAG_PHYSICAL = 1 << 11,
		ENTITY_IMMUNITY_FLAG_CURSE = 1 << 12,
		ENTITY_IMMUNITY_FLAG_BLEED = 1 << 13,

		ENTITY_IMMUNITY_FLAG_MELEE = 1 << 14,
		ENTITY_IMMUNITY_FLAG_HOLY = 1 << 15,
		ENTITY_IMMUNITY_FLAG_SHADOW = 1 << 16,
		ENTITY_IMMUNITY_FLAG_NATURE = 1 << 17,
		ENTITY_IMMUNITY_FLAG_FIRE = 1 << 18,
		ENTITY_IMMUNITY_FLAG_FROST = 1 << 19,
		ENTITY_IMMUNITY_FLAG_LIGHTNING = 1 << 20,
		ENTITY_IMMUNITY_FLAG_CHAOS = 1 << 21,

		ENTITY_IMMUNITY_FLAG_SLOW = 1 << 22,
		ENTITY_IMMUNITY_FLAG_CRIT = 1 << 23,
		ENTITY_IMMUNITY_FLAG_AOE = 1 << 24,
		ENTITY_IMMUNITY_FLAG_DAMAGE = 1 << 25,
		ENTITY_IMMUNITY_FLAG_FALL_DAMAGE = 1 << 26,
		ENTITY_IMMUNITY_FLAG_PROJECTILE = 1 << 27,
		ENTITY_IMMUNITY_FLAG_DEBUFF = 1 << 28,
		ENTITY_IMMUNITY_FLAG_ATTACKS = 1 << 29,
		ENTITY_IMMUNITY_FLAG_DISPELL = 1 << 30,
	};

	enum CommonCharacterSkeletonPoints {
		COMMON_SKELETON_POINT_ROOT = 0,
		COMMON_SKELETON_POINT_PELVIS,
		COMMON_SKELETON_POINT_SPINE,
		COMMON_SKELETON_POINT_SPINE_1,
		COMMON_SKELETON_POINT_SPINE_2,
		COMMON_SKELETON_POINT_NECK,
		COMMON_SKELETON_POINT_HEAD,
		COMMON_SKELETON_POINT_TORSO,
		COMMON_SKELETON_POINT_RIGHT_HIP,
		COMMON_SKELETON_POINT_LEFT_HIP,
		COMMON_SKELETON_POINT_BACK,
		COMMON_SKELETON_POINT_LEFT_HAND,
		COMMON_SKELETON_POINT_RIGHT_HAND,

		COMMON_SKELETON_POINT_WEAPON_LEFT,
		COMMON_SKELETON_POINT_WEAPON_RIGHT,
		COMMON_SKELETON_POINT_WEAPON_LEFT_BACK,
		COMMON_SKELETON_POINT_WEAPON_RIGHT_BACK,

		COMMON_SKELETON_POINT_WEAPON_LEFT_SHIELD,
		COMMON_SKELETON_POINT_WEAPON_RIGHT_SHIELD,

		COMMON_SKELETON_POINTS_MAX,
	};

	enum AIStates {
		AI_STATE_OFF = 0,
		AI_STATE_REST,
		AI_STATE_PATROL,
		AI_STATE_FOLLOW_PATH,
		AI_STATE_REGENERATE,
		AI_STATE_ATTACK,

		AI_STATE_PET_OFF,
		AI_STATE_PET_FOLLOW,
		AI_STATE_PET_STOP,
		AI_STATE_PET_ATTACK,

		AI_STATE_MAX,
	};

	enum EntityRelationType {
		ENTITY_RELATION_TYPE_NEUTRAL = 0,
		ENTITY_RELATION_TYPE_FRIENDLY,
		ENTITY_RELATION_TYPE_HOSTILE,
	};

	enum EntityInteractionType {
		ENITIY_INTERACTION_TYPE_NORMAL = 0,
		ENITIY_INTERACTION_TYPE_SPEAK,
		ENITIY_INTERACTION_TYPE_LOOT,
		ENITIY_INTERACTION_TYPE_USE,
		ENITIY_INTERACTION_TYPE_TRAIN,
		ENITIY_INTERACTION_TYPE_VENDOR,
		ENITIY_INTERACTION_TYPE_NONE,
	};

	enum EntityClassPlaystyleType {
		ENTITY_CLASS_PLAYSTYLE_TYPE_MELEE = 0,
		ENTITY_CLASS_PLAYSTYLE_TYPE_SPELL,
		ENTITY_CLASS_PLAYSTYLE_TYPE_HYBRID,
		ENTITY_CLASS_PLAYSTYLE_TYPE_NONE,
	};

	enum EntityWindows {
		ENTITY_WINDOW_LOOT = 0,
		ENTITY_WINDOW_CONTAINER,
		ENTITY_WINDOW_VENDOR,
		ENTITY_WINDOW_TRAINER,
	};

	enum EntityResourceIndices {
		ENTITY_RESOURCE_INDEX_HEALTH = 0,
		ENTITY_RESOURCE_INDEX_SPEED = 1,
		ENTITY_RESOURCE_INDEX_RESOURCES_BEGIN = 2,
	};

	enum {
		BASE_XP = 50,
		ENTITY_INTERACT_RANGE = 4,
		ENTITY_INTERACT_RANGE_SQUARED = ENTITY_INTERACT_RANGE * ENTITY_INTERACT_RANGE,
	};

	EntityEnums() {}

protected:
	static void _bind_methods();
};

VARIANT_ENUM_CAST(EntityEnums::EntityPlayerType);
VARIANT_ENUM_CAST(EntityEnums::EntityController);
VARIANT_ENUM_CAST(EntityEnums::EntityFlags);
VARIANT_ENUM_CAST(EntityEnums::EntityStateTypeFlags);
VARIANT_ENUM_CAST(EntityEnums::EntityStateTypeIndexes);
VARIANT_ENUM_CAST(EntityEnums::CommonCharacterSkeletonPoints);
VARIANT_ENUM_CAST(EntityEnums::AIStates);
VARIANT_ENUM_CAST(EntityEnums::EntityImmunityFlags);
VARIANT_ENUM_CAST(EntityEnums::EntityRelationType);
VARIANT_ENUM_CAST(EntityEnums::EntityInteractionType);
VARIANT_ENUM_CAST(EntityEnums::EntityClassPlaystyleType);
VARIANT_ENUM_CAST(EntityEnums::EntityWindows);
VARIANT_ENUM_CAST(EntityEnums::EntityResourceIndices);

#endif