#ifndef PIXELDEFENSE_SYSTEMS_H
#define PIXELDEFENSE_SYSTEMS_H

#include <flecs.h>

#include "components.h"


/**********************************
 * Entity Systems
 **********************************/

/* Observer (for unregistering collision)
 * 0: Game (singleton)
 * 1: Position
 * 3: SpatialGridID
 */
void entitySpatialRemoved(ecs_iter_t *it);

/* Observer (for releasing path objects)
 * 0: Game (singleton) for object pool
 * 1: Path
 */
void pathRemoved(ecs_iter_t *it);

/*
 * 0: Game (singleton) for entity map
 * 1: Position
 * 2: Size
 * 3: Velocity (only entities with velocity change position)
 * 4: SpatialGridID
 */
void entityUpdateSpatialID(ecs_iter_t *it);

/*
 * 0: Game (singleton) for collisions
 * 1: Position
 * 2: Rotation
 * 3: Velocity
 * 4: AngularVelocity
 * 5: SteeringOutput
 */
void entityUpdateKinematic(ecs_iter_t *it);

/*
 * 0: Game (singleton) for object pool
 * 1: Position
 * 2: Rotation
 * 3: Velocity
 * 4: AngularVelocity
 * 5: SteeringOutput
 * 6: Path
 */
void entityFollowPath(ecs_iter_t *it);

/*
 * 0:
 */
void renderTerrain(ecs_iter_t *it);
void renderBuildings(ecs_iter_t *it);
void renderEntities(ecs_iter_t *it);

/*
 * 1: Position
 * 2: Size
 */
void renderColliders(ecs_iter_t *it);

/*
 * 1: Path
 */
void renderDebugPath(ecs_iter_t *it);



/**********************************
 * Input systems
 **********************************/

/*
 * Task:
 * 0: Game (singleton)
 * 0: InputState (singleton)
 */
void updatePlayerInput(ecs_iter_t *it);

/*
 * Task:
 * 0: Game (singleton)
 * 0: InputState (singleton)
 */
void drawPlayerInputUI(ecs_iter_t *it);

/**********************************
 * UI systems
 **********************************/

#endif //PIXELDEFENSE_SYSTEMS_H
