#ifndef __PROGRAM_H__
#define __PROGRAM_H__

#define to_int(x) (x >= 0 ? (int)(x+0.5) : (int)(x-0.5))

#define SPEED_LIMIT 0.1
#define PADDLE_HEIGHT 8

void start_ball(Canvas* c, Ball* ball);
void update_ball(Canvas* c, Ball* ball);
void draw_ball(Canvas* c, Ball* ball);
void update_paddle(Canvas* c, Paddle* paddle, Ball* ball);
void draw_paddle(Canvas* c, Paddle* paddle);
float paddle_AI(Canvas* c, Paddle* paddle, Ball* ball);
int check_winning(Canvas* c, Ball* ball);
void declare_winner(Canvas* c, int winner);

// Helper functions
float min(float a, float b);
float max(float a, float b);
float abs_val(float x);
float remap(float value, float istart, float istop, float ostart, float ostop);
float limit_topspeed(float x, float a);
bool intersect_rect(float obj_x, float obj_y, float rect_x1, float rect_y1, float rect_x2, float rect_y2); 

// Constructors
Ball* create_ball();
Paddle* create_paddle(Canvas* c, PaddleSide side);

#endif
