#ifndef PHYSICS_HEADER
#define PHYSICS_HEADER

class Block2d {
  public:
    Vector2 position  = {screenWidth/2, screenHeight/2};
    Vector2 direction = {0, 0};
    const float max_speed = 1200;
    Vector2 speed = {0, 0};
    double last_update;

    Block2d(void) {
        last_update = GetTime();
    }

    void accelerate(float * v, float extra) {
        if (abs(*v + extra) < max_speed) {
            *v = abs(*v + extra);
        } else {
            *v = max_speed;
        }
    }

    void control(Vector2 click) {
        direction = diff(position, click);
        Vector2 speed_addition = {
            direction.x,
            direction.y,
        };
        accelerate(&speed.x, speed_addition.x);
        accelerate(&speed.y, speed_addition.y);
        direction = (Vector2) {
            .x = signum(direction.x),
            .y = signum(direction.y),
        };
    }

    void decelerate(float * v) {
        if (*v - 1.1f > 0) {
            *v -= 1.1f;
        } else {
            *v = 0;
        }
    }

    void update(void) {
        double update_time = GetTime();
        position.x -= speed.x * (update_time - last_update) * direction.x;
        position.y -= speed.y * (update_time - last_update) * direction.y;

        decelerate(&speed.x);
        decelerate(&speed.y);

        last_update = update_time;
    }

    void display(void) {
        // Block
        DrawRectangle(position.x, position.y, 30, 30, RED);

        // Hud
        DrawText(TextFormat("X: %5.2f", position.x), 10, 10, 20, DARKGRAY);
        DrawText(TextFormat("Y: %5.2f", position.y), 10, 40, 20, DARKGRAY);
        DrawText(TextFormat("Speed X: %5.2f", speed.x), 10, 70, 20, DARKGRAY);
        DrawText(TextFormat("Speed Y: %5.2f", speed.y), 10, 100, 20, DARKGRAY);
    }


} content;

#endif