#ifndef PHYSICS_HEADER
#define PHYSICS_HEADER

class BlockProjectile {
  public:
    const int block_size = 30;

    const float G = 98.0f * 2;

    Vector2 display_offset;
    Vector2 position;
    Vector2 velocity;
    double last_update;

    /* Used for tracing the block visually,
     *  not for calculations
     */
    vector<Vector2> trajectory;

    void reset(void) {
        position = { 0, 0 };
        velocity.y = (rand() % 400) + 3;
        velocity.x = (rand() % (150*2)) - 150;
        trajectory.clear();
    }

    BlockProjectile() {
        display_offset.x = (screenWidth / 2) - (block_size - 2);
        display_offset.y = screenHeight - 100 - (block_size - 2);
        reset();
    }

    double speed(Vector2 velocity) {
        return sqrt(pow(velocity.x, 2) + pow(velocity.y, 2));
    }

    void display(void) {
        for (auto &p : trajectory) {
            DrawPixelV(
                (Vector2) {
                    .x = p.x + display_offset.x,
                    .y = p.y + display_offset.y,
                },
                BLUE
            );
        }

        DrawCircleV(display_offset, 7, GREEN);

        DrawRectangle(
            position.x + display_offset.x - (block_size/2),
            position.y + display_offset.y - (block_size/2),
            block_size,
            block_size,
            RED
        );

        // HUD
        DrawText("Stone Trajectory Simulation", 10, 10, 20, DARKGRAY);
        DrawText(TextFormat("Time: %.2f s", last_update), 10, 40, 20, DARKGRAY);
        DrawText(TextFormat("Speed: %.2f", speed(velocity)), 10, 70, 20, DARKGRAY);
    }

    void control(Vector2 click) {
        /* NOTE: this module is automatic*/;
    }

    void update(void) {
        if (position.y + display_offset.y > screenHeight) {
            reset();
            return;
        }

        trajectory.push_back(position);

        double update_time = GetTime();

        Vector2 delta;
        delta.x = velocity.x * (update_time - last_update);
        delta.y = velocity.y * (update_time - last_update);

        position.x += delta.x;
        position.y -= delta.y;

        velocity.y -= G * (update_time - last_update);
        
        last_update = update_time;
    }
} content;

#endif