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

#ifndef __EntityComponent_collidable_H__
#define __EntityComponent_collidable_H__

typedef struct EntityComponent_collidable EntityComponent_collidable;
#define EntityComponent_collidable_superclass GameEntityComponent

#include "gamemath/Vector2i.h"
#include "PROJECT_NAME/GameEntityComponent.h"

typedef bool (* EntityComponent_collidable_collisionCallback)(struct GameEntity * collidingEntity, Vector2i fromDirection, void * context);

#define EntityComponent_collidable_ivars \
	GameEntityComponent_ivars \
	\
	EntityComponent_collidable_collisionCallback collisionCallback; \
	void * callbackContext;

#define EntityComponent_collidable_vtable(self_type) \
	GameEntityComponent_vtable(self_type) \
	\
	bool (* collision)(self_type * self, struct GameEntity * collidingEntity, Vector2i fromDirection);

stemobject_declare(EntityComponent_collidable)

EntityComponent_collidable * EntityComponent_collidable_create(EntityComponent_collidable_collisionCallback collisionCallback, void * callbackContext);
bool EntityComponent_collidable_init(EntityComponent_collidable * self, EntityComponent_collidable_collisionCallback collisionCallback, void * callbackContext);
void EntityComponent_collidable_dispose(EntityComponent_collidable * self);
void EntityComponent_collidable_initCopy(EntityComponent_collidable * self, compat_type(GameEntityComponent *) original);
bool EntityComponent_collidable_collision(EntityComponent_collidable * self, struct GameEntity * collidingEntity, Vector2i fromDirection);

bool alwaysSolidCollisionCallback(struct GameEntity * collidingEntity, Vector2i fromDirection, void * context);

#endif
