#ifndef SPELL_ENUMS_H
#define SPELL_ENUMS_H

/*************************************************************************/
/*  spell_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"

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

public:
	static const String BINDING_STRING_SPELL_TYPES;
	static const String BINDING_STRING_SPELL_CATEGORY;
	static const String BINDING_STRING_TRIGGER_EVENTS;
	static const String BINDING_STRING_DAMAGE_TYPES;
	static const String BINDING_STRING_AURA_TYPES;
	static const String BINDING_STRING_AURA_FLAG_TYPES;
	static const String BINDING_STRING_COLLIDER_TYPE;
	static const String BINDING_STRING_TARGET_TYPE;
	static const String BINDING_STRING_TRIGGER_TYPE;
	static const String BINDING_STRING_TRIGGER_NOTIFICATION_TYPE;

	static const String BINDING_STRING_NOTIFICATION_AURAS;
	static const String BINDING_STRING_NOTIFICATION_DAMAGES;
	static const String BINDING_STRING_NOTIFICATION_HEALS;
	static const String BINDING_STRING_NOTIFICATION_CASTS;

	enum DamageType {
		DAMAGE_TYPE_NONE = 0,
		DAMAGE_TYPE_MELEE = 1 << 0,
		DAMAGE_TYPE_HOLY = 1 << 1,
		DAMAGE_TYPE_SHADOW = 1 << 2,
		DAMAGE_TYPE_NATURE = 1 << 3,
		DAMAGE_TYPE_FIRE = 1 << 4,
		DAMAGE_TYPE_FROST = 1 << 5,
		DAMAGE_TYPE_LIGHTNING = 1 << 6,
		DAMAGE_TYPE_CHAOS = 1 << 7,
	};

	enum SpellCategory {
		SPELL_CATEGORY_NORMAL = 0,
		SPELL_CATEGORY_ALCHEMY = 1,
		SPELL_CATEGORY_COOKING = 2,
		SPELL_CATEGORY_ENGINEERING = 3,
		SPELL_CATEGORY_CRAFTING = 4,
		SPELL_CATEGORY_HIDDEN = 5,
		SPELL_CATEGORY_DEVELOPMENT = 6,
	};

	enum SpellType {
		SPELL_TYPE_NONE = 0,
		SPELL_TYPE_MELEE = 1 << 0,
		SPELL_TYPE_HOLY = 1 << 1,
		SPELL_TYPE_SHADOW = 1 << 2,
		SPELL_TYPE_NATURE = 1 << 3,
		SPELL_TYPE_FIRE = 1 << 4,
		SPELL_TYPE_FROST = 1 << 5,
		SPELL_TYPE_LIGHTNING = 1 << 6,
		SPELL_TYPE_CHAOS = 1 << 7,
	};

	enum AuraType {
		AURA_TYPE_NONE = 0,
		AURA_TYPE_MAGIC = 1 << 0,
		AURA_TYPE_POISON = 1 << 1,
		AURA_TYPE_PHYSICAL = 1 << 2,
		AURA_TYPE_CURSE = 1 << 3,
		AURA_TYPE_BLEED = 1 << 4,
		AURA_TYPE_TALENT = 1 << 5,
		AURA_TYPE_SKILL = 1 << 6,
	};

	enum ColliderType {
		COLLIDER_TYPE_NONE = 0,
		COLLIDER_TYPE_SPHERE,
		COLLIDER_TYPE_BOX
	};

	enum TargetType {
		TARGET_TYPE_NONE = 0,
		TARGET_TYPE_NODE,
		TARGET_TYPE_BONE_ID,
		TARGET_TYPE_COORDS,
	};

	enum TriggerType {
		TRIGGER_TYPE_NONE = 0,
		TRIGGER_TYPE_PERCENT,
		TRIGGER_TYPE_PPM,
	};

	enum TriggerNotificationType {
		TRIGGER_NOTIFICATION_TYPE_AURA = 0,
		TRIGGER_NOTIFICATION_TYPE_DAMAGE,
		TRIGGER_NOTIFICATION_TYPE_HEAL,
		TRIGGER_NOTIFICATION_TYPE_CAST,
		TRIGGER_NOTIFICATION_TYPE_DEATH,
		TRIGGER_NOTIFICATION_TYPE_COOLDOWN_ADDED,
		TRIGGER_NOTIFICATION_TYPE_COOLDOWN_REMOVED,
		TRIGGER_NOTIFICATION_TYPE_CATEGORY_COOLDOWN_ADDED,
		TRIGGER_NOTIFICATION_TYPE_CATEGORY_COOLDOWN_REMOVED,
		TRIGGER_NOTIFICATION_TYPE_GCD_STARTED,
		TRIGGER_NOTIFICATION_TYPE_GCD_FINISHED,
		TRIGGER_NOTIFICATION_TYPE_XP_GAINED,
		TRIGGER_NOTIFICATION_TYPE_CLASS_LEVELUP,
		TRIGGER_NOTIFICATION_TYPE_CHARACTER_LEVELUP,
		TRIGGER_NOTIFICATION_TYPE_ENTITY_RESOURCE_ADDED,
		TRIGGER_NOTIFICATION_TYPE_ENTITY_RESOURCE_REMOVED,
		TRIGGER_NOTIFICATION_TYPE_AURA_CUSTOM,
		TRIGGER_NOTIFICATION_TYPE_DAMAGE_CUSTOM,
		TRIGGER_NOTIFICATION_TYPE_HEAL_CUSTOM,
		TRIGGER_NOTIFICATION_TYPE_CAST_CUSTOM,
		TRIGGER_NOTIFICATION_TYPE_CUSTOM,
	};

	enum {
		NOTIFICATION_AURA_BEFORE_APPLIED = 0,
		NOTIFICATION_AURA_AFTER_APPLIED,
		NOTIFICATION_AURA_APPLIED,
		NOTIFICATION_AURA_ADDED,
		NOTIFICATION_AURA_REMOVED,
		NOTIFICATION_AURA_REFRESHED,
	};

	enum {
		NOTIFICATION_DAMAGE_BEFORE_HIT = 0,
		NOTIFICATION_DAMAGE_HIT,
		NOTIFICATION_DAMAGE_BEFORE_DAMAGE,
		NOTIFICATION_DAMAGE_RECEIVE,
		NOTIFICATION_DAMAGE_DEALT_DAMAGE,
		NOTIFICATION_DAMAGE_DAMAGE_DEALT,
		NOTIFICATION_DAMAGE_DAMAGE,
	};

	enum {
		NOTIFICATION_HEAL_BEFORE_HIT = 0,
		NOTIFICATION_HEAL_BEFORE_HEAL,
		NOTIFICATION_HEAL_RECEIVE,
		NOTIFICATION_HEAL_DEALT_HEAL,
		NOTIFICATION_HEAL_HEAL_DEALT,
	};

	enum {
		NOTIFICATION_CAST_BEFORE = 0,
		NOTIFICATION_CAST_BEFORE_CAST_TARGET,
		NOTIFICATION_CAST_FINISHED_TARGET,
		NOTIFICATION_CAST_FINISHED,
		NOTIFICATION_CAST_STARTED,
		NOTIFICATION_CAST_FAILED,
		NOTIFICATION_CAST_SUCCESS,
		NOTIFICATION_CAST_INTERRUPTED,
		NOTIFICATION_CAST_DELAYED,
	};

	SpellEnums() {}

protected:
	static void _bind_methods() {
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_NONE);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_MELEE);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_HOLY);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_SHADOW);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_NATURE);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_FIRE);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_FROST);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_LIGHTNING);
		BIND_ENUM_CONSTANT(DAMAGE_TYPE_CHAOS);

		BIND_ENUM_CONSTANT(SPELL_CATEGORY_NORMAL);
		BIND_ENUM_CONSTANT(SPELL_CATEGORY_ALCHEMY);
		BIND_ENUM_CONSTANT(SPELL_CATEGORY_COOKING);
		BIND_ENUM_CONSTANT(SPELL_CATEGORY_ENGINEERING);
		BIND_ENUM_CONSTANT(SPELL_CATEGORY_CRAFTING);
		BIND_ENUM_CONSTANT(SPELL_CATEGORY_HIDDEN);
		BIND_ENUM_CONSTANT(SPELL_CATEGORY_DEVELOPMENT);

		BIND_ENUM_CONSTANT(SPELL_TYPE_NONE);
		BIND_ENUM_CONSTANT(SPELL_TYPE_MELEE);
		BIND_ENUM_CONSTANT(SPELL_TYPE_HOLY);
		BIND_ENUM_CONSTANT(SPELL_TYPE_SHADOW);
		BIND_ENUM_CONSTANT(SPELL_TYPE_NATURE);
		BIND_ENUM_CONSTANT(SPELL_TYPE_FIRE);
		BIND_ENUM_CONSTANT(SPELL_TYPE_FROST);
		BIND_ENUM_CONSTANT(SPELL_TYPE_LIGHTNING);
		BIND_ENUM_CONSTANT(SPELL_TYPE_CHAOS);

		BIND_ENUM_CONSTANT(AURA_TYPE_NONE);
		BIND_ENUM_CONSTANT(AURA_TYPE_MAGIC);
		BIND_ENUM_CONSTANT(AURA_TYPE_POISON);
		BIND_ENUM_CONSTANT(AURA_TYPE_PHYSICAL);
		BIND_ENUM_CONSTANT(AURA_TYPE_CURSE);
		BIND_ENUM_CONSTANT(AURA_TYPE_BLEED);
		BIND_ENUM_CONSTANT(AURA_TYPE_TALENT);
		BIND_ENUM_CONSTANT(AURA_TYPE_SKILL);

		BIND_ENUM_CONSTANT(COLLIDER_TYPE_NONE);
		BIND_ENUM_CONSTANT(COLLIDER_TYPE_SPHERE);
		BIND_ENUM_CONSTANT(COLLIDER_TYPE_BOX);

		BIND_ENUM_CONSTANT(TARGET_TYPE_NONE);
		BIND_ENUM_CONSTANT(TARGET_TYPE_NODE);
		BIND_ENUM_CONSTANT(TARGET_TYPE_BONE_ID);
		BIND_ENUM_CONSTANT(TARGET_TYPE_COORDS);

		BIND_ENUM_CONSTANT(TRIGGER_TYPE_NONE);
		BIND_ENUM_CONSTANT(TRIGGER_TYPE_PERCENT);
		BIND_ENUM_CONSTANT(TRIGGER_TYPE_PPM);

		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_AURA);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_DAMAGE);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_HEAL);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_CAST);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_DEATH);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_COOLDOWN_ADDED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_COOLDOWN_REMOVED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_CATEGORY_COOLDOWN_ADDED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_CATEGORY_COOLDOWN_REMOVED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_GCD_STARTED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_GCD_FINISHED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_XP_GAINED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_CLASS_LEVELUP);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_CHARACTER_LEVELUP);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_ENTITY_RESOURCE_ADDED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_ENTITY_RESOURCE_REMOVED);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_AURA_CUSTOM);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_DAMAGE_CUSTOM);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_HEAL_CUSTOM);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_CAST_CUSTOM);
		BIND_ENUM_CONSTANT(TRIGGER_NOTIFICATION_TYPE_CUSTOM);

		BIND_CONSTANT(NOTIFICATION_AURA_BEFORE_APPLIED);
		BIND_CONSTANT(NOTIFICATION_AURA_AFTER_APPLIED);
		BIND_CONSTANT(NOTIFICATION_AURA_APPLIED);
		BIND_CONSTANT(NOTIFICATION_AURA_ADDED);
		BIND_CONSTANT(NOTIFICATION_AURA_REMOVED);
		BIND_CONSTANT(NOTIFICATION_AURA_REFRESHED);

		BIND_CONSTANT(NOTIFICATION_DAMAGE_BEFORE_HIT);
		BIND_CONSTANT(NOTIFICATION_DAMAGE_HIT);
		BIND_CONSTANT(NOTIFICATION_DAMAGE_BEFORE_DAMAGE);
		BIND_CONSTANT(NOTIFICATION_DAMAGE_RECEIVE);
		BIND_CONSTANT(NOTIFICATION_DAMAGE_DEALT_DAMAGE);
		BIND_CONSTANT(NOTIFICATION_DAMAGE_DAMAGE_DEALT);

		BIND_CONSTANT(NOTIFICATION_HEAL_BEFORE_HIT);
		BIND_CONSTANT(NOTIFICATION_HEAL_BEFORE_HEAL);
		BIND_CONSTANT(NOTIFICATION_HEAL_RECEIVE);
		BIND_CONSTANT(NOTIFICATION_HEAL_DEALT_HEAL);
		BIND_CONSTANT(NOTIFICATION_HEAL_HEAL_DEALT);

		BIND_CONSTANT(NOTIFICATION_CAST_BEFORE);
		BIND_CONSTANT(NOTIFICATION_CAST_BEFORE_CAST_TARGET);
		BIND_CONSTANT(NOTIFICATION_CAST_FINISHED_TARGET);
		BIND_CONSTANT(NOTIFICATION_CAST_FINISHED);
		BIND_CONSTANT(NOTIFICATION_CAST_STARTED);
		BIND_CONSTANT(NOTIFICATION_CAST_FAILED);
		BIND_CONSTANT(NOTIFICATION_CAST_SUCCESS);
		BIND_CONSTANT(NOTIFICATION_CAST_INTERRUPTED);
		BIND_CONSTANT(NOTIFICATION_CAST_DELAYED);
	}
};

VARIANT_ENUM_CAST(SpellEnums::SpellType);
VARIANT_ENUM_CAST(SpellEnums::SpellCategory);
VARIANT_ENUM_CAST(SpellEnums::DamageType);
VARIANT_ENUM_CAST(SpellEnums::AuraType);
VARIANT_ENUM_CAST(SpellEnums::ColliderType);
VARIANT_ENUM_CAST(SpellEnums::TargetType);
VARIANT_ENUM_CAST(SpellEnums::TriggerNotificationType);
VARIANT_ENUM_CAST(SpellEnums::TriggerType);

#endif