#ifndef _fencer_transformable_h
#define _fencer_transformable_h

#include "vmath.h"
#include "typeclass_helpers.h"

typedef struct {
    struct Transform* (*const get_transform)(void* self);
} ITransformable;

typedef struct {
    void* data;
    ITransformable const* tc;
} Transformable;

extern Vector transformable_get_position(Transformable self);
extern void transformable_set_position(Transformable self, Vector position);
extern void transformable_move(Transformable self, Vector delta);

extern Vector transformable_get_scale(Transformable self);
extern void transformable_set_scale(Transformable self, Vector scale);
extern void transformable_scale(Transformable self, Vector factor);

extern float transformable_get_rotation(Transformable self);
extern void transformable_set_rotation(Transformable self, float rotation);
extern void transformable_rotate(Transformable self, float delta);

#define impl_Transformable_for(T, get_transform_f)\
Transformable T##_as_Transformable(T* x) {\
    TC_FN_TYPECHECK(Transform*, get_transform_f, T*);\
    static ITransformable const tc = {\
        .get_transform =    (Transform*(*const)(void*)) get_transform_f\
    };\
    return (Transformable){.tc = &tc, .data = x};\
}

#endif // !_fencer_transformable_h
