#pragma once

#include "../../../core/vector.h"

namespace ac
{

namespace model
{

class Asteroid;
class Powerup;

class IEventTarget
{
public:

	enum GameState
	{
		GAMEOVER,
		BEGIN,
		LOSELIFE,
		NEXTLEVEL,
	};

	enum BombType
	{
		BOMB_SHIP,
		BOMB_NORMAL,
		BOMB_BOUNCE,
		BOMB_LASER,
	};

	virtual void togglePause() = 0;
	virtual void setShipInput(const core::Vector2f& anAimTarget, const float aThrust, const bool aTrigger, const bool aBombTrigger) = 0;
	virtual void resetGame(const GameState aState) = 0;
	virtual void asteroidHit(const Asteroid& anAsteroid) = 0;
	virtual void makeAsteroid(const unsigned int aType, const core::Vector2f& aPosition) = 0;
	virtual void makeBullet(const unsigned char aType, const core::Vector2f& aPosition, const core::Vector2f& aVector) = 0;
	virtual void makeLaser(const core::Vector2f& aStart, const core::Vector2f& anEnd) = 0;
	virtual void detonateBomb(const core::Vector2f& aPosition, const BombType aType) = 0;
	virtual void getPowerup(const Powerup& aPowerup) = 0;
	virtual void makePowerup(const core::Vector2f& aPosition) = 0;
	virtual void bulletBounced() = 0;
	virtual void shipDeath() = 0;
	virtual void extraMan() = 0;
	virtual void submitScore(const char* aName) = 0;
	virtual void newMultiplier() = 0;
	virtual void score(const core::Vector2f& aPosition, const unsigned int aScore) = 0;
	virtual void closeCall(const core::Vector2f& aPosition, const unsigned int aScore) = 0;
	virtual void levelComplete() = 0;
	virtual void togglePowerup(const unsigned char aType) = 0;
};

}

}

