#ifndef __asteroids_h__
#define __asteroids_h__

#include "vector.h"

// Enums
typedef enum bullettype { AllyBullet = 0, EnemyBullet = 1 } BulletType;
// End Enums

// Structs
typedef struct bulletStruct {
    double Rotation;
    Vector Location, Momentum;
    SDL_Rect TargetRect;
    int Lifetime;
    bool IsDestroyed;
    BulletType Type;
} Bullet;

typedef struct enemyStruct {
    bool IsDead;
    Vector Location, Momentum;
    SDL_Rect TargetRect;
    int WeaponCooldown, lastBulletIndex, DeadTime, TurnCooldown;
    Bullet * Bullets;
} Enemy;

typedef struct shipStruct {
    bool TurnRightButtonPressed, TurnLeftButtonPressed, ForwardButtonPressed, ShootButtonPressed, IsDead;
    double Rotation;
    Vector FacingDirection, Location, Momentum;
    SDL_Rect TargetRect_Gliding, TargetRect_Accelerating, TargetRect_Explosion;
    int WeaponCooldown, lastBulletIndex, DeadTime;
    Bullet * Bullets;
} Ship;

typedef struct asteroidStruct {
    double Rotation, Size, RotationValue;
    Vector Location, Momentum;
    SDL_Rect TargetRect, SourceRect;
    bool IsDestroyed;
    int Health;
} Asteroid;
// End Structs

// Prototypes
void ASTEROIDS_InitializeGame(SDL_Renderer * renderer, int width, int height);
void ASTEROIDS_DeinitializeGame();
void BULLET_Initialize(SDL_Renderer * renderer);
void ENEMY_Initialize(SDL_Renderer * renderer);
void SHIP_Initialize(SDL_Renderer * renderer);
void ASTEROID_Initialize(SDL_Renderer * renderer);
void BULLET_Deinitialize();
void ENEMY_Deinitialize();
void ASTEROID_Deinitialize();
void SHIP_Deinitialize();
Bullet BULLET_Fire(Vector location, double direction, BulletType type);
Asteroid ASTEROID_CreateRandom();
bool ASTEROID_TryDestroy(Asteroid * asts, int * astCount, int index);
Asteroid ASTEROID_CreateFromSplit(Asteroid * creator);
bool ASTEROID_CanSplit(Asteroid * ast);
bool RECT_CircleCollide(SDL_Rect * rect1, SDL_Rect * rect2);
void RECT_CheckBoundaries(Vector * location, SDL_Rect * Target);
double distance(SDL_Rect * r1, SDL_Rect * r2);
void ASTEROID_Update(Asteroid * ast);
void ASTEROID_Draw(Asteroid * ast, SDL_Renderer * renderer);
Enemy ENEMY_GetDefault();
void ENEMY_DestroyObject(Enemy * enm);
void ENEMY_Update(Enemy * enm, Ship * targets, int targetCount);
void ENEMY_Draw(Enemy * enm, SDL_Renderer * renderer);
Ship SHIP_CreateDefault();
void SHIP_DestroyObject(Ship * shp);
void SHIP_Update(Ship * shp, Uint8 * keystate, Asteroid * asts, int * astCount, Enemy * enemies, int * enemyCount);
void SHIP_Draw(Ship * shp, SDL_Renderer * renderer);
// End Prototypes

#endif // __asteroids_h__
