#include "health_status.h"
#include "macros.h"

String HealthStatus::sig_death{ "death" };
String HealthStatus::sig_health_changed{ "health_changed" };

void HealthStatus::_bind_methods() {
	BIND_PROPERTY(Variant::INT, health);

	ADD_SIGNAL(MethodInfo(sig_death));
	ADD_SIGNAL(MethodInfo(sig_health_changed, PropertyInfo(Variant::INT, "remaining"), PropertyInfo(Variant::INT, "delta")));
}

void HealthStatus::ready() {
	this->max_health = this->health;
}

void HealthStatus::_notification(int what) {
	if (Engine::get_singleton()->is_editor_hint()) {
		return;
	}
	switch (what) {
		default:
			return;
		case NOTIFICATION_READY:
			ready();
			return;
	}
}

void HealthStatus::set_health(int value) {
	this->health = value;
}

int HealthStatus::get_health() const {
	return this->health;
}

void HealthStatus::damage(int amount) {
	if (this->health > 0) {
		amount = Math::abs(amount);
		this->health -= amount;
		emit_signal(sig_health_changed, this->health, -amount);
		if (this->health <= 0) {
			emit_signal(sig_death);
		}
	}
}
