// Copyright (c) 2023 Alex Diener. All rights reserved.

#include "PROJECT_NAME/EntityComponent_collidable.h"
#include "PROJECT_NAME/GameEntity.h"

#define stemobject_implementation EntityComponent_collidable

stemobject_vtable_begin();
stemobject_vtable_entry(dispose);
stemobject_vtable_entry(initCopy);
stemobject_vtable_entry(collision);
stemobject_vtable_end();

EntityComponent_collidable * EntityComponent_collidable_create(EntityComponent_collidable_collisionCallback collisionCallback, void * callbackContext) {
	stemobject_create_implementation(init, collisionCallback, callbackContext)
}

bool EntityComponent_collidable_init(EntityComponent_collidable * self, EntityComponent_collidable_collisionCallback collisionCallback, void * callbackContext) {
	call_super(init, self);
	self->collisionCallback = collisionCallback;
	self->callbackContext = callbackContext;
	return true;
}

void EntityComponent_collidable_dispose(EntityComponent_collidable * self) {
	call_super_virtual(dispose, self);
}

void EntityComponent_collidable_initCopy(EntityComponent_collidable * self, compat_type(GameEntityComponent *) originalUntyped) {
	call_super_virtual(initCopy, self, originalUntyped);
	EntityComponent_collidable * original = originalUntyped;
	self->collisionCallback = original->collisionCallback;
	self->callbackContext = original->callbackContext;
}

bool EntityComponent_collidable_collision(EntityComponent_collidable * self, struct GameEntity * collidingEntity, Vector2i fromDirection) {
	return self->collisionCallback(collidingEntity, fromDirection, self->callbackContext);
}

bool alwaysSolidCollisionCallback(struct GameEntity * collidingEntity, Vector2i fromDirection, void * context) {
	return true;
}
