#ifndef FIGHT_PLAYER_H
#define FIGHT_PLAYER_H

#include "state_machine.h"
#include "state.h"
#include "behaviour_entity.h"
#include "animation_sprite.h"
#include "input.h"
#include "vmath.h"
#include "transform.h"
#include "player_input.h"
#include "rigidbody.h"
#include "collider.h"

extern const Vector PLAYER_SPEED;

typedef struct Player {
    Transform transform;

    RigidBody* rigidbody;
    Collider* physicsCollider;

    PlayerInput* playerInput;

    Vector moveInput;
    int attackInput;
    size_t animationTriggers;

    int facing;

    Sprite* sprite;

    AnimationSprite* idle;
    AnimationSprite* walk;
    AnimationSprite* jab_a;
    AnimationSprite* jab_b;

    StateMachine* animationStateMachine;

    AnimationSprite* currentAnimation;
} Player;

Player* MakePlayer();
Player* SpawnPlayer(Vector location);
void DestroyPlayer(Player* self);

void PlayerHorizontalInput(Player* self, InputEvent value);
void PlayerVerticalInput(Player* self, InputEvent value);
void PlayerAttackInput(Player* self, InputEvent value);

void PlayerStart(Player* self);
void PlayerUpdate(Player* self, float deltaTime);
void PlayerDraw(Player* self);

Transform* PlayerGetTransform(Player* self);

RigidBody* PlayerGetRigidBody(Player* self);
void PlayerOnCollision(Player* self, Collision collision);
void PlayerOnOverlap(Player* self, Collider* other);

static long PlayerGetDepth(Player* self) { return -10-(int)(self->transform.position.y * 1000); }

impl_no_MessageReceiver_for(Player)

impl_Drop_for(Player,
    DestroyPlayer
)

impl_BehaviourEntity_for(Player,
    PlayerStart,
    PlayerUpdate,
    PlayerDraw,
    PlayerGetDepth
)

impl_Transformable_for(Player,
    PlayerGetTransform
)

impl_PhysicsEntity_for(Player,
    PlayerGetRigidBody,
    PlayerOnCollision,
    PlayerOnOverlap
)

#endif // !FIGHT_PLAYER_H
